Re: [PATCH 0/3] Generalized "string function" syntax
From: René Scharfe <hidden>
Date: 2016-06-15 22:47:34
Junio C Hamano schrieb:
René Scharfe [off-list ref] writes:quoted
Junio C Hamano schrieb:quoted
I mentioned an idea to enhance the pretty=format language with a string function syntax that people can extend by adding new functions in one of the "What's cooking" messages earlier. The general syntax would be like %[function(args...)any string here%] where "any string here" part would have the usual pretty=format strings. E.g. git show -s --format='%{w(72,8,4)%s%+b%]' should give you a line wrapped commit log message if w(width,in1,in2) is such a function.I pondered line wrapping with format strings briefly a long time ago, and I always considered it to be more similar to a colour, i.e. a state that one can change and that is applied to all following text until the next state change. (Except that it's always reset at the end of the format string.) The example above would then turn into '%w(72,8,4)%s%+b'.As a syntax to express "wrapping" behaviour alone, I think this is much simpler and more superiour. I guess with this if you want to wrap something to 72 columns and then wrap something else to 66 columns, you would write '%w(72,8,4)something%w(66,8,4)something else', right?
That's right.
I used %] only for two reasons. - Without an explicit "here it ends", I couldn't come up with a good way to express '%[w(72,8,4)something%]something else'. IOW, how I can say "wrap something to 72 columns and then place something else without any wrapping"?
My patch makes '%w()' reset the wrapping parameters to their defaults.
- When we need to support more than one string function like this, it is unclear what '%f()one string%g()another one' in your syntax means. Does it mean '%[f()one string%]%[g()another one%]' (i.e. concatenate the result of applying string function f to 'one string' and the result of applying string function g to 'another one')? Or does it mean '%[f()one string%[g()another one%]%]' (apply 'f' to concatenation of 'one string' and the result of applying 'g' to 'another one')?
I was going to say that we already have something like that with %C, and that the natural way (to me) is to apply them both, independently. Case modification functions (upper, lower, capitalized) could be treated the same way -- as state changes (like pressing caps lock when typing text). Which other text functions are we going to add which would break this model? The only thing I can think of right now is nesting such functions themselves, e.g. when indenting a list in an indented sub-paragraph in an indented paragraph. Useful? But then something else hit me: the line wrap function needs to consider colour codes as having a length of zero. Ugh. René