parent
b9992c24e1
commit
1b8c01e319
|
@ -353,6 +353,17 @@ class Application(object):
|
||||||
self.add_buffer(b)
|
self.add_buffer(b)
|
||||||
if switch_to:
|
if switch_to:
|
||||||
self.switch_buffer(b)
|
self.switch_buffer(b)
|
||||||
|
def color_data_buffer(self, name, data, switch_to=True, modename='colortext'):
|
||||||
|
if self.has_buffer_name(name):
|
||||||
|
b = self.bufferlist.buffer_names[name]
|
||||||
|
self.remove_buffer(b)
|
||||||
|
b = buffer.ColorDataBuffer(name, data)
|
||||||
|
if modename is not None:
|
||||||
|
b.modename = modename
|
||||||
|
window.Window(b, self, height=0, width=0)
|
||||||
|
self.add_buffer(b)
|
||||||
|
if switch_to:
|
||||||
|
self.switch_buffer(b)
|
||||||
def get_buffer_by_path(self, path):
|
def get_buffer_by_path(self, path):
|
||||||
return self.bufferlist.get_buffer_by_path(path)
|
return self.bufferlist.get_buffer_by_path(path)
|
||||||
def has_buffer_name(self, name):
|
def has_buffer_name(self, name):
|
||||||
|
|
15
buffer.py
15
buffer.py
|
@ -646,11 +646,12 @@ class ColorHighlighter(highlight.Highlighter):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.tokens = []
|
self.tokens = []
|
||||||
def append_token(self, y, x, s, color):
|
def append_token(self, y, x, s, color):
|
||||||
s = s.replace('\\[', '[')
|
s2 = s.replace('\\[', '[')
|
||||||
s = s.replace('\\]', ']')
|
s2 = s2.replace('\\]', ']')
|
||||||
s = s.replace('\\\\', '\\')
|
s2 = s2.replace('\\\\', '\\')
|
||||||
t = lex.Token('color_data', None, y, x, s, color)
|
t = lex.Token('color_data', None, y, x, s2, color)
|
||||||
self.tokens[y].append(t)
|
self.tokens[y].append(t)
|
||||||
|
return len(s) - len(s2)
|
||||||
def highlight(self, lines):
|
def highlight(self, lines):
|
||||||
if self.tokens:
|
if self.tokens:
|
||||||
return
|
return
|
||||||
|
@ -666,13 +667,13 @@ class ColorHighlighter(highlight.Highlighter):
|
||||||
if m:
|
if m:
|
||||||
(j, k) = (m.start(), m.end())
|
(j, k) = (m.start(), m.end())
|
||||||
if j > i:
|
if j > i:
|
||||||
self.append_token(y, i - offset, line[i:j], c)
|
offset += self.append_token(y, i - offset, line[i:j], c)
|
||||||
fields = m.group(1).split(':')
|
fields = m.group(1).split(':')
|
||||||
c = [self.color_map.get(x, x) for x in fields]
|
c = [self.color_map.get(x, x) for x in fields]
|
||||||
offset += k - j
|
offset += k - j
|
||||||
i = k
|
i = k
|
||||||
else:
|
else:
|
||||||
self.append_token(y, i - offset, line[i:], c)
|
offset += self.append_token(y, i - offset, line[i:], c)
|
||||||
break
|
break
|
||||||
|
|
||||||
class ColorDataBuffer(DataBuffer):
|
class ColorDataBuffer(DataBuffer):
|
||||||
|
@ -707,7 +708,7 @@ ABOUT_DATA = '''
|
||||||
[y:d:*]***** [c:d:*]pmacs[d:d:*] is available to you under the [c:d:*]GNU General Public License v2
|
[y:d:*]***** [c:d:*]pmacs[d:d:*] is available to you under the [c:d:*]GNU General Public License v2
|
||||||
[y:d:*]*****
|
[y:d:*]*****
|
||||||
[y:d:*]***** [d:d:*]to see all available commands use: [c:d:*]C-c M-h [b:d:*](show-bindings-buffer)
|
[y:d:*]***** [d:d:*]to see all available commands use: [c:d:*]C-c M-h [b:d:*](show-bindings-buffer)
|
||||||
|
\\[foo\\]x\\[bar\\]x\\\\x\\[foo\\]x\\[[y:d]bar\\]x\\[\\]x\\[[r:d:*]\\]
|
||||||
[r:d:*]================================================================================
|
[r:d:*]================================================================================
|
||||||
'''
|
'''
|
||||||
class AboutBuffer(ColorDataBuffer):
|
class AboutBuffer(ColorDataBuffer):
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import os, commands, re, sets, tempfile
|
import os, commands, re, sets, tempfile
|
||||||
from subprocess import Popen, PIPE, STDOUT
|
from subprocess import Popen, PIPE, STDOUT
|
||||||
|
|
||||||
import buffer, default, dirutil, regex, util, window
|
import buffer, default, dirutil, lex, regex, util, window
|
||||||
from point import Point
|
from point import Point
|
||||||
|
|
||||||
from method import DATATYPES, Method, Argument
|
from method import DATATYPES, Method, Argument
|
||||||
|
@ -182,3 +182,51 @@ class SvnBlame(Method):
|
||||||
w.application.data_buffer("*Blame*", data, switch_to=True, modename='blame')
|
w.application.data_buffer("*Blame*", data, switch_to=True, modename='blame')
|
||||||
else:
|
else:
|
||||||
w.set_error("There was an error (%s)" % (status))
|
w.set_error("There was an error (%s)" % (status))
|
||||||
|
|
||||||
|
class SvnBlame2(Method):
|
||||||
|
'''show blame output for the current version in SVN'''
|
||||||
|
line_re = re.compile('^ *(\d+) *([a-zA-Z0-9_]+) *([-0-9]+) *([:0-9]+) *(-\d{4}) *\(([^\)]+)\) (.*)\n$')
|
||||||
|
def _execute(self, w, **vargs):
|
||||||
|
if not hasattr(w.buffer, 'path'):
|
||||||
|
w.set_error("Buffer has no corresponding file")
|
||||||
|
return
|
||||||
|
|
||||||
|
cmd = ("/usr/bin/svn", 'blame', '-v', w.buffer.path)
|
||||||
|
pipe = Popen(cmd, stdin=PIPE, stdout=PIPE)
|
||||||
|
|
||||||
|
linetokens = []
|
||||||
|
for line in pipe.stdout:
|
||||||
|
m = self.line_re.match(line)
|
||||||
|
if not m:
|
||||||
|
raise Exception, line
|
||||||
|
(rev, user, date, t, tz, vdate, content) = m.groups()
|
||||||
|
linetokens.append([rev, user, date, content, []])
|
||||||
|
status = pipe.wait() >> 8
|
||||||
|
|
||||||
|
lines = [x[3] for x in linetokens]
|
||||||
|
if w.mode.grammar:
|
||||||
|
lexer = lex.Lexer(w.mode, w.mode.grammar)
|
||||||
|
lextokens = [[] for l in lines]
|
||||||
|
for t in lexer.lex(lines):
|
||||||
|
linetokens[t.y][4].append(t)
|
||||||
|
|
||||||
|
lines = []
|
||||||
|
for linetoken in linetokens:
|
||||||
|
(rev, user, date, content, lextokens) = linetoken
|
||||||
|
prefix = '[b:d:*]%-4s [c:d:*]%-10s [b:d:*]%10s[d:d:*]' % (rev, user, date)
|
||||||
|
if lextokens:
|
||||||
|
suffixes = []
|
||||||
|
for lt in lextokens:
|
||||||
|
s = lt.string.replace('\\', '\\\\')
|
||||||
|
s = s.replace('[', '\\[').replace(']', '\\]')
|
||||||
|
suffixes.append('[%s:%s:*]%s' % (lt.color[0], lt.color[1], s))
|
||||||
|
suffix = ''.join(suffixes)
|
||||||
|
else:
|
||||||
|
suffix = content
|
||||||
|
lines.append('%s %s' % (prefix, suffix))
|
||||||
|
data = ''.join(lines)
|
||||||
|
|
||||||
|
if status == 0:
|
||||||
|
w.application.color_data_buffer("*Blame*", data, switch_to=True)
|
||||||
|
else:
|
||||||
|
w.set_error("There was an error (%s)" % (status))
|
||||||
|
|
Loading…
Reference in New Issue