Feature request: Better way to handle SCM blame/annotate syntax highlighting

9 views
Skip to first unread message

Ted Pavlic

unread,
Jan 26, 2009, 10:30:17 AM1/26/09
to vim_dev
There are several syntax highlighting options available for SCM
blame/annotate outputs (e.g., "CVSAnnotate.vim", "HGAnnotate.vim",
etc.). However, AFAIK, none of them have the ability to use the
annotate-style highlighting on the "left" side of the page (where all of
the SCM info is) and filetype highlighting on the "right" side of the page.

It would be nice if there was some feature that would allow something like:

:set scmtype=git
:set filetype=c

That is, an output of "git blame myfile.c | vim -" would get highlighted
so that the "left" side of the blame output was highlighted matching
"git blame" rules, and the "right" side of the blame output would use
standard highlighting rules for c.

Then left/right autodetection would be the next nice feature... That is,
Vim would have to be able to detect that it's looking at a
blame/annotate-type file and then detect which SCM format to use on the
left and which filetype to use on the right.

I have a feeling that such a feature is non-trivial. That being said, I
think the demand for such a feature is growing.

Thanks --
Ted


--
Ted Pavlic <t...@tedpavlic.com>

Please visit my ALS association page:
http://web.alsa.org/goto/tedpavlic
My family appreciates your support in the fight to defeat ALS.

Ben Fritz

unread,
Jan 27, 2009, 9:12:39 AM1/27/09
to vim_dev


On Jan 26, 9:30 am, Ted Pavlic <t...@tedpavlic.com> wrote:

>
> That is, an output of "git blame myfile.c | vim -" would get highlighted
> so that the "left" side of the blame output was highlighted matching
> "git blame" rules, and the "right" side of the blame output would use
> standard highlighting rules for c.
>

While it is possible in some cases to highlight certain areas of a
file using rules for a different filetype (http://vim.wikia.com/wiki/
Different_syntax_highlighting_within_regions_of_a_file) what you are
asking is currently not possible in Vim. Syntax highlighting works
using regular expressions, often spanning multiple lines. You would
need to somehow force Vim to skip over the "left" side when applying
the rules and highlighting to the right, and the same for the left.

Modifying syntax rules to accomplish this for specific cases might be
possible, but really isn't feasible. To include "blame" rules in the
filetype for the base file, you could modify the syntax rules of every
possible filetype you're going to be using "blame" on, adding regions
for the blame output that can be contained in every multi-line syntax
group. You'd also need to change any rules that match the beginning of
a line. This would be a never-ending task, and wouldn't really be very
maintainable. It might not even be possible for some syntax rules
without a wholesale rewrite. The opposite approach, including basic
file types in the blame syntax rules, would be even more daunting. You
would somehow need to duplicate or apply the rules for multi-line
matches in the file within the single-line matches of the blame
output.

All this being said, you could probably make some sort of plugin to
get functionality similar to what you want. After reading in the
"blame" output, you could fairly easily split the file into a left and
right window, with the left window containing only the blame output
and the right containing only the un-annotated file. Set filetypes in
each window appropriately, set scrollbind, and you're basically done.
This method could even be generalized to fit _any_ blame output and
_any_ base file type. It would rely on a simple regex to recognize
where the blame output ends and a line in the file starts. Obviously
you'd want several blame types built in, but simply allowing a custom
regex would make it infinitely extensible. Perhaps there is even a
plugin that does this already?

Ingo Karkat

unread,
Jan 27, 2009, 9:14:59 AM1/27/09
to vim...@googlegroups.com
On 26-Jan-09 16:30, Ted Pavlic wrote:
> There are several syntax highlighting options available for SCM
> blame/annotate outputs (e.g., "CVSAnnotate.vim", "HGAnnotate.vim",
> etc.). However, AFAIK, none of them have the ability to use the
> annotate-style highlighting on the "left" side of the page (where all of
> the SCM info is) and filetype highlighting on the "right" side of the page.
>
> It would be nice if there was some feature that would allow something like:
>
> :set scmtype=git
> :set filetype=c
>
> That is, an output of "git blame myfile.c | vim -" would get highlighted
> so that the "left" side of the blame output was highlighted matching
> "git blame" rules, and the "right" side of the blame output would use
> standard highlighting rules for c.
>
> Then left/right autodetection would be the next nice feature... That is,
> Vim would have to be able to detect that it's looking at a
> blame/annotate-type file and then detect which SCM format to use on the
> left and which filetype to use on the right.
>
> I have a feeling that such a feature is non-trivial. That being said, I
> think the demand for such a feature is growing.
>
> Thanks --
> Ted

Hi Ted,

You're right, such a feature would be difficult to accommodate with the current
mechanism for syntax highlighting (and without duplicating and maintaining an
entire suite of git-c, git-cpp, ... syntaxes). I also cannot imagine support for
a new ':set scmtype' setting within VIM; after all, it is a text editor, and
those SCM annotations are usually only viewed, not edited, right?

However, I can imagine a quick solution that could be implemented relatively
cheaply in vimscript, and might be suitable if all you want is _view_ these
kinds of output. Here's a sketch:
1. Create two scratch buffers (buftype=nofile, etc), vertically split, with :set
scrollbind.
2. Open the 'git blame' output in a third buffer and use e.g. blockwise Visual
mode (CTRL-V) to copy-and-paste the left (git) block into the left scratch
buffer, and the right (programming-language) block into the right one.
3. Close the third buffer, :set filetype=git on the left, trigger a filetype
detection on the right buffer.
If you put these actions in a custom command, you could "prettify" the output
with a few keystrokes, or even use the existing filetype detection mechanism to
auto-detect and auto-prettify this.
Of course, it's two buffers, not one, so jumping around isn't completely
natural. On the other hand, the two-buffer split may even make certain
copy-paste actions easier to do.

-- regards, ingo

PS: Ben, just saw your reply coming in when I wanted to press "send". Seems you
have had the same idea?!

--
-- Ingo Karkat -- /^-- /^-- /^-- /^-- /^-- /^-- http://ingo-karkat.de/ --
--
Shift happens. -- Doppler

Danek Duvall

unread,
Jan 27, 2009, 9:24:48 AM1/27/09
to vim...@googlegroups.com
On Tue, Jan 27, 2009 at 06:12:39AM -0800, Ben Fritz wrote:

> On Jan 26, 9:30 am, Ted Pavlic <t...@tedpavlic.com> wrote:
>
> > That is, an output of "git blame myfile.c | vim -" would get highlighted
> > so that the "left" side of the blame output was highlighted matching
> > "git blame" rules, and the "right" side of the blame output would use
> > standard highlighting rules for c.
>
> While it is possible in some cases to highlight certain areas of a
> file using rules for a different filetype (http://vim.wikia.com/wiki/
> Different_syntax_highlighting_within_regions_of_a_file) what you are
> asking is currently not possible in Vim.
>

> [ ... ]


>
> All this being said, you could probably make some sort of plugin to
> get functionality similar to what you want. After reading in the
> "blame" output, you could fairly easily split the file into a left and
> right window, with the left window containing only the blame output
> and the right containing only the un-annotated file.

Ideally, wouldn't annotate look very much like the 'number' option in terms
of how it's put on the screen? They're both per-line metadata, after all.

Danek

Reply all
Reply to author
Forward
0 new messages