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@xxxxxxxxx> Signed-off-by: Fernando Ramos <greenfoo@xxxxxx> --- mergetools/vimdiff | 69 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/mergetools/vimdiff b/mergetools/vimdiff index f770b8fe24..ee99a0b03e 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