zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: complete % placeholders for git log --format
@ 2015-06-17 12:50 Oliver Kiddle
  0 siblings, 0 replies; only message in thread
From: Oliver Kiddle @ 2015-06-17 12:50 UTC (permalink / raw)
  To: Zsh workers

After git log --format=format: you can specify custom formats.

With newer versions of git there's some things this doesn't handle like
padding fields and complex colour specifications but it handles anything
I'd likely do in a one-off command.

Main reason this doesn't use _describe is that it forces the -l compadd
option.

Oliver

diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index 088a7db..3e72886 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -6269,6 +6269,95 @@ __git_setup_diff_stage_options () {
   )
 }
 
+(( $+functions[__git_format_placeholders] )) ||
+__git_format_placeholders() {
+  local sep
+  local -a disp names placeholders expl
+  if compset -P 'format:'; then
+    compset -P '(%[^acgCG]|%?[^%]|[^%])#'
+    if compset -P '%C'; then
+      _wanted colors expl color compadd reset red green blue
+      return
+    fi
+    if [[ -prefix %G ]]; then
+      placeholders=(
+	'GG:raw verification message'
+	'G?:indicate [G]ood, [B]ad, [U]ntrusted or [N]o signature'
+	'GS:name of signer'
+	'GK:signing key'
+      )
+      disp=( -l )
+    elif [[ -prefix %g ]]; then
+      placeholders=(
+	gD:'reflog selector'
+	gd:'short reflog selector'
+	gn:'reflog identity'
+	gs:'reflog subject'
+      )
+      disp=( -l )
+    elif [[ $PREFIX = (#b)%([ac]) ]]; then
+      placeholders=(
+	n:'name'
+	N:'name (use .mailmap)'
+	e:'email'
+	E:'email (use .mailmap)'
+	d:'date'
+	D:'date, RFC2822 style'
+	r:'date, relative'
+	t:'date, UNIX timestamp'
+	i:'date, like ISO 8601'
+	I:'date, strict ISO 8601'
+      )
+      placeholders=( $match[1]$^placeholders )
+    else
+      placeholders=(
+	H:commit\ hash
+	h:'abbreviated commit hash'
+	T:'tree hash'
+	t:'abbreviated tree hash'
+	P:'parent hash'
+	p:'abbreviated parent hash'
+	a:'author details'
+	c:'committer details'
+	d:'ref name in brackets'
+	D:'ref name'
+	e:encoding
+	s:subject
+	f:'sanitized subject'
+	g:reflog
+	b:body
+	B:'raw body'
+	N:notes
+	G:GPG\ details
+	C:color
+	m:mark
+	n:newline
+	%:raw\ %
+	x:'hex code'
+	w:'switch line wrapping'
+      )
+    fi
+    names=( ${placeholders%%:*} )
+    if zstyle -T ":completion:${curcontext}:" verbose; then
+      zstyle -s ":completion:${curcontext}:" list-separator sep || sep=--
+      zformat -a placeholders " $sep " $placeholders
+      disp+=(-d placeholders)
+    else
+      disp=()
+    fi
+    _wanted placeholders expl placeholder \
+        compadd -p % -S '' "$disp[@]" "$@" - "$names[@]"
+  else
+    _describe -t formats format '( oneline:"commit-ids and subject of messages"
+      short:"few headers and only subject of messages"
+      medium:"most parts of messages"
+      full:"all parts of commit messages"
+      fuller:"like full and includes dates"
+      email:"use email headers like From and Subject"
+      raw:"the raw commits" )' -- '( format:"specify own format" )' -S ':'
+  fi
+}
+
 (( $+functions[__git_setup_revision_options] )) ||
 __git_setup_revision_options () {
   local -a diff_options
@@ -6276,16 +6365,7 @@ __git_setup_revision_options () {
 
   revision_options=(
     $diff_options
-    # TODO: format pretty print format is a lot more advanced than this.
-    # TODO: You can't actually specify --format without a format.
-    '(-v --header)'{--pretty=-,--format=-}'[pretty print commit messages]::format:((oneline\:"commit-ids and subject of messages"
-                                                                                    short\:"few headers and only subject of messages"
-                                                                                    medium\:"most parts of messages"
-                                                                                    full\:"all parts of commit messages"
-                                                                                    fuller\:"like full and includes dates"
-                                                                                    email\:"use email headers like From and Subject"
-                                                                                    raw\:"the raw commits"
-                                                                                    format\:"specify own format"))'
+    '(-v --header)'{--pretty=-,--format=-}'[pretty print commit messages]::format:__git_format_placeholders'
     '(--abbrev-commit --no-abbrev-commit)--abbrev-commit[show only partial prefixes of commit object names]'
     '(--abbrev-commit --no-abbrev-commit)--no-abbrev-commit[show the full 40-byte hexadecimal commit object name]'
     '(--abbrev --no-abbrev)--abbrev=[set minimum SHA1 display-length (for use with --abbrev-commit)]: :__git_guard_number length'


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2015-06-17 12:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-17 12:50 PATCH: complete % placeholders for git log --format Oliver Kiddle

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).