The parameter order follows indent()/label() functions, but this might be a bad idea because fill() is more likely to have optional parameters. We can instead add template.fill(width) method as well as .indent(prefix). If we take this approach, we'll probably need to add string.fill()/indent() methods, and/or implicit cast at method resolution. The good thing about the method syntax is that we can add string.refill(), etc. for free, without inventing generic labeled template functions. For #1043, I think it's better to add a config like ui.log-word-wrap = true. We could add term_width/graph_width keywords to the templater, but the implementation would be more complicated, and is difficult to use for the basic use case. Unlike Mercurial, our templater doesn't have a context map to override the graph_width stub.
4.1 KiB
Templates
Jujutsu supports a functional language to customize output of commands. The language consists of literals, keywords, operators, functions, and methods.
A couple of jj
commands accept a template via -T
/--template
option.
Keywords
Keywords represent objects of different types; the types are described in a follow-up section.
Commit keywords
The following keywords can be used in jj log
/jj obslog
templates.
description: String
change_id: ChangeId
commit_id: CommitId
parent_commit_ids: List<CommitId>
author: Signature
committer: Signature
working_copies: String
: For multi-workspace repository, indicate working-copy commit as<workspace name>@
.current_working_copy: Boolean
: True for the working-copy commit of the current workspace.branches: String
tags: String
git_refs: String
git_head: String
divergent: Boolean
: True if the change id corresponds to multiple visible commits.conflict: Boolean
: True if the commit contains merge conflicts.empty: Boolean
: True if the commit modifies no files.
Operation keywords
The following keywords can be used in jj op log
templates.
current_operation: Boolean
description: String
id: OperationId
tags: String
time: TimestampRange
user: String
Operators
The following operators are supported.
x.f()
: Method call.x ++ y
: Concatenatex
andy
templates.
Global functions
The following functions are defined.
fill(width: Integer, content: Template) -> Template
: Fill lines at the givenwidth
.indent(prefix: Template, content: Template) -> Template
: Indent non-empty lines by the givenprefix
.label(label: Template, content: Template) -> Template
: Apply label to the content. Thelabel
is evaluated as a space-separated string.if(condition: Boolean, then: Template[, else: Template]) -> Template
: Conditionally evaluatethen
/else
template content.concat(content: Template...) -> Template
: Same ascontent_1 ++ ... ++ content_n
.separate(separator: Template, content: Template...) -> Template
: Insert separator between non-empty contents.
Types
Boolean type
No methods are defined.
CommitId / ChangeId type
The following methods are defined.
.short([len: Integer]) -> String
.shortest([min_len: Integer]) -> ShortestIdPrefix
: Shortest unique prefix.
Integer type
No methods are defined.
List type
The following methods are defined.
.join(separator: Template) -> Template
: Concatenate elements with the givenseparator
.
OperationId type
The following methods are defined.
.short([len: Integer]) -> String
ShortestIdPrefix type
The following methods are defined.
.prefix() -> String
.rest() -> String
.upper() -> ShortestIdPrefix
.lower() -> ShortestIdPrefix
Signature type
The following methods are defined.
.name() -> String
.email() -> String
.username() -> String
.timestamp() -> Timestamp
String type
A string can be implicitly converted to Boolean
. The following methods are
defined.
.contains(needle: Template) -> Boolean
.first_line() -> String
.lines() -> List<String>
: Split into lines excluding newline characters..upper() -> String
.lower() -> String
Template type
Any types can be implicitly converted to Template
. No methods are defined.
Timestamp type
The following methods are defined.
.ago() -> String
: Format as relative timestamp.
TimestampRange type
The following methods are defined.
.start() -> Timestamp
.end() -> Timestamp
.duration() -> String
Configuration
The default templates and aliases are defined
in the [templates]
and [template-aliases]
sections respectively.
New keywords and functions can be defined as aliases, by using any combination of the predefined keywords/functions and other aliases.
For example:
[template-aliases]
'commit_change_ids' = '''
concat(
format_field("Commit ID", commit_id),
format_field("Change ID", commit_id),
)
'''
'format_field(key, value)' = 'key ++ ": " ++ value ++ "\n"'