git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 2/3] mergetools: vimdiff: fix single tab mode, single window mode and colors

From
Fernando Ramos <greenfoo@u92.eu>
Date
Aug 8, 2022, 05:34 UTC
Message-ID
<20220808053459.184367-3-greenfoo@u92.eu>
In-Reply-To
<20220808053459.184367-1-greenfoo@u92.eu>

vimdiff3 was introduced in 7c147b77d3 (mergetools: add vimdiff3 mode, 2014-04-20) and then partially broken in 0041797449 (vimdiff: new implementation with layout support, 2022-03-30) in two ways:

    - It does not show colors unless the user has "set hidden" in his
      .vimrc file
    - It prompts the user to "Press ENTER" every time it runs.
This patch fixes both issues and, in adition:
  - Unifies the previously "special" case where LAYOUT contained one single tab
    with one single window.
  - Fixes colors in tabs with just one window.
Cc: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Fernando Ramos <greenfoo@u92.eu>
---
 mergetools/vimdiff | 69 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 49 insertions(+), 20 deletions(-)
diff --git a/mergetools/vimdiff b/mergetools/vimdiff
index ea416adcaa..f8cd7a83f0 100644
--- a/mergetools/vimdiff
+++ b/mergetools/vimdiff
@@ -55,12 +55,40 @@ substring () {
 	echo "$STRING" | cut -c$(( START + 1 ))-$(( START + $LEN ))
 }
 
+enable_diff_mode () {
+	# Auxiliary function that appends extra vim commands at the end of each
+	# tab section to enable diff mode
+
+	NUMBER_OF_WINDOWS_IN_TAB=$1
+
+	if test "$NUMBER_OF_WINDOWS_IN_TAB" -eq 1
+	then
+		# Tabs that only contains one window will "diff"
+		# against all loaded/hidden buffers
+
+		echo "let tmp=bufnr('%') | execute 'silent 1,4bufdo diffthis' | execute 'buffer '.tmp"
+	else
+		# Tabs that contain more than one window will
+		# only "diff" against those windows
+
+		echo "execute 'windo diffthis'"
+	fi
+}
+
 gen_cmd_aux () {
 	# Auxiliary function used from "gen_cmd()".
 	# Read that other function documentation for more details.
+	#
+	# This function returns two items
+	#    - STDOUT:  The vim command to use
+	#    - RETCODE: The number of windows opened in the current tab
 
-	LAYOUT=$1
-	CMD=$2  # This is a second (hidden) argument used for recursion
+	WINDOWS_NR=$1 # Number of windows opened in the current tab after
+	              # having parsed the provided "LAYOUT"
+	              # If applicable, this variable will be updated and
+	              # returned in RETCODE
+	LAYOUT=$2     # Substring (from the original LAYOUT) to process
+	CMD=$3        # This is a third (hidden) argument used for recursion
 
 	debug_print
 	debug_print "LAYOUT    : $LAYOUT"
@@ -232,6 +260,7 @@ gen_cmd_aux () {
 		after="wincmd j"
 		index=$index_horizontal_split
 		terminate="true"
+		WINDOWS_NR=$(( WINDOWS_NR + 1 ))
 
 	elif ! test -z "$index_vertical_split"
 	then
@@ -239,16 +268,27 @@ gen_cmd_aux () {
 		after="wincmd l"
 		index=$index_vertical_split
 		terminate="true"
+		WINDOWS_NR=$(( WINDOWS_NR + 1 ))
 	fi
 
 	if  test "$terminate" = "true"
 	then
 		CMD="$CMD | $before"
-		CMD=$(gen_cmd_aux "$(substring "$LAYOUT" "$start" "$(( index - start ))")" "$CMD")
+		CMD=$(gen_cmd_aux $WINDOWS_NR "$(substring "$LAYOUT" "$start" "$(( index - start ))")" "$CMD")
+		WINDOWS_NR=$?
+
+		if ! test -z "$index_new_tab"
+		then
+			CMD="$CMD | $(enable_diff_mode $WINDOWS_NR)"
+			WINDOWS_NR=1
+		fi
+
 		CMD="$CMD | $after"
-		CMD=$(gen_cmd_aux "$(substring "$LAYOUT" "$(( index + 1 ))" "$(( ${#LAYOUT} - index ))")" "$CMD")
+		CMD=$(gen_cmd_aux $WINDOWS_NR "$(substring "$LAYOUT" "$(( index + 1 ))" "$(( ${#LAYOUT} - index ))")" "$CMD")
+		WINDOWS_NR=$?
+
 		echo "$CMD"
-		return
+		return $WINDOWS_NR
 	fi
 
 
@@ -280,10 +320,9 @@ gen_cmd_aux () {
 	fi
 
 	echo "$CMD"
-	return
+	return $WINDOWS_NR
 }
 
-
 gen_cmd () {
 	# This function returns (in global variable FINAL_CMD) the string that
 	# you can use when invoking "vim" (as shown next) to obtain a given
@@ -333,25 +372,15 @@ gen_cmd () {
 
 	# Obtain the first part of vim "-c" option to obtain the desired layout
 
-	CMD=$(gen_cmd_aux "$LAYOUT")
-
-
-	# Adjust the just obtained script depending on whether more than one
-	# windows are visible or not
-
-	if echo "$LAYOUT" | grep ",\|/" >/dev/null
-	then
-		CMD="$CMD | tabdo windo diffthis"
-	else
-		CMD="$CMD | bufdo diffthis"
-	fi
+	CMD=$(gen_cmd_aux 1 "$LAYOUT")
+	CMD="$CMD | $(enable_diff_mode $?)"
 
 
 	# Add an extra "-c" option to move to the first tab (notice that we
 	# can't simply append the command to the previous "-c" string as
 	# explained here: https://github.com/vim/vim/issues/9076
 
-	FINAL_CMD="-c \"$CMD\" -c \"tabfirst\""
+	FINAL_CMD="-c \"set hidden diffopt-=hiddenoff diffopt-=closeoff\" -c \"$CMD\" -c \"tabfirst\""
 }
 
 
-- 
2.37.1
Previous: Fernando RamosNext: Felipe Contreras
Message 22 of 28 in “mergetools: vimdiff: regression fix and reorg”
  1. 0/9 mergetools: vimdiff: regression fix and reorgFelipe Contreras, Aug 7, 2022
  2. 1/9 mergetools: vimdiff: fix commentFelipe Contreras, Aug 7, 2022
  3. 2/9 mergetools: vimdiff: shuffle single window caseFelipe Contreras, Aug 7, 2022
  4. Fernando RamosAug 7, 2022
  5. Felipe ContrerasAug 7, 2022
  6. 3/9 mergetools: vimdiff: add get_buf() helperFelipe Contreras, Aug 7, 2022
  7. 4/9 mergetools: vimdiff: make vimdiff3 actually workFelipe Contreras, Aug 7, 2022
  8. 6/9 mergetools: vimdiff: fix for diffoptFelipe Contreras, Aug 7, 2022
  9. 5/9 mergetools: vimdiff: silence annoying messagesFelipe Contreras, Aug 7, 2022
  10. 7/9 mergetools: vimdiff: cleanup cruftFelipe Contreras, Aug 7, 2022
  11. 8/9 mergetools: vimdiff: fix single window modeFelipe Contreras, Aug 7, 2022
  12. 9/9 mergetools: vimdiff: use vimdiff for vimdiff3Felipe Contreras, Aug 7, 2022
  13. Fernando RamosAug 7, 2022
  14. Fernando RamosAug 7, 2022
  15. Felipe ContrerasAug 7, 2022
  16. Fernando RamosAug 7, 2022
  17. 1/2 vimdiff: fix single tab mode, single window mode and colorsFernando Ramos, Aug 7, 2022
  18. 2/2 vimdiff: update unit testsFernando Ramos, Aug 7, 2022
  19. Felipe ContrerasAug 7, 2022
  20. 0/3 mergetools: vimdiff: regression fix (vimdiff3 mode)Fernando Ramos, Aug 8, 2022
  21. 1/3 mergetools: vimdiff: fix commentFernando Ramos, Aug 8, 2022
  22. 2/3 mergetools: vimdiff: fix single tab mode, single window mode and colorsFernando Ramos, Aug 8, 2022
  23. Felipe ContrerasAug 8, 2022
  24. Fernando RamosAug 8, 2022
  25. Felipe ContrerasAug 8, 2022
  26. Fernando RamosAug 8, 2022
  27. Felipe ContrerasAug 9, 2022
  28. 3/3 mergetools: vimdiff: update unit testsFernando Ramos, Aug 8, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.