2015-06-21 21:17 GMT+03:00 Olaf Dabrunz <[email protected]>:
> On 21-Jun-15, Manuel Ortega wrote:
>> Doing ":h diffoff" gives:
>>
>> The ":diffoff" command resets the relevant options to the values they
>> had when using |:diffsplit|, |:diffpatch| , |:diffthis|. or starting Vim
>> in diff mode. Otherwise they are set to their default value:
>>
>> 'diff' off
>> 'scrollbind' off
>> 'cursorbind' off
>> 'scrollopt' without "hor"
>> 'wrap' on
>> 'foldmethod' "manual"
>> 'foldcolumn' 0
>>
>> What this doesn't tell you is that :diffoff will perform this resetting
>> under more circumstances than mentioned, namely if diff mode was already
>> off; but in this circumstance, the resetting is both unexpected and
>> undesirable.
>
> This is intentional. There have been discussions and patches touching
> this:
>
> [PATCH] :diffoff should not change settings for non-diff windows
> Lech Lorens
> https://groups.google.com/forum/#!topic/vim_dev/UEqB5ppy49g
>
> [patch] diffoff! does not check &diff in current window
> Charles Cooper
> https://groups.google.com/forum/#!topic/vim_dev/IOvSxDIJIqY
>
> The documentation for 'diffoff' was updated in 7.4.490:
>
> :diffo[ff] Switch off diff mode for the current window. Resets
> related options also when 'diff' was not set.
>
> ':diffoff' works even when the current window does not have 'diff' set,
> because people tend to ':set nodiff', and only then remember to
> ':diffoff' to get rid of the other settings made by ':diffthis'.
>
>> Specifically, if you forget that diff mode is already off and you do
>> :diffoff a second time, you will lose &scrollbind, &foldmethod, &wrap,
>> etc if you had them set to something other than those defaults. This is
>> really annoying. I kept wondering what happened to my folds!
>> Sometimes I had &scrollbind on outside of diff mode, and I lost it after
>> inadvertently doing a second :diffoff.
>
> So the problem seems to be that ':diffoff' forgets about the saved
> values when it is used the first time, so on the second ':diffoff' it
> restores the defaults.
>
> The patch below changes this so that the saved settings are never
> forgotten. And with the patch they get updated whenever ':diffthis' or
> friends are used on a window that is not yet in 'diff' mode.
>
> So a second ':diffthis' in a diff window does not overwrite the settings
> saved when entering diff mode. And a second ':diffoff' restores the
> settings that were saved the last time when this window entered diff
> mode.
>
> A second ':diffoff' can of course still lose settings that you made
> after the first ':diffoff'. But I do not see a simple solution for
> that. Maybe you can live with that.
>
> No documentation in the patch, because in my understanding the current
> docs seem to imply this behavior:
>
> The ":diffoff" command resets the relevant options to the values
> they had when using |:diffsplit|, |:diffpatch| , |:diffthis|. or
> starting Vim in diff mode. Otherwise they are set to their default
> value:
>
>
> With the patch, ':diffoff' will only restore the defaults if the window
> has never been in a diff.
>
> Question to the list: should ':diffoff' *ever* restore default settings?
>
> Maybe it is better to only restore settings that have been saved before,
> when entering diff mode at some point, if that has happened at all.
>
> Because if the window was never switched to diff mode, why should
> ':diffoff' restore settings that have never been changed by diff mode,
> and then to some arbitrary defaults? Better leave these settings
> untouched in that case?
In addition to windows that have never been in diff mode there are
windows which have never been in *non-diff* mode: i.e. first window
obtained using `vim -d` (command
vim -u NONE -i NONE -N --cmd 'au FileType * :echomsg "diff:"
&diff' --cmd 'filetype plugin indent on' --cmd 'echomsg "diffinit:"
join(map(range(1, winnr("$")), "getwinvar(v:val, \"&diff\")"))' -d
/tmp/a.py /tmp/b.py
or (assuming /tmp/a.py and /tmp/b.py are already present) (no, BufNew,
BufEnter and BufAdd are either not launched at all (!) or are launched
too late (BufEnter))
vim -u NONE -i NONE -N --cmd 'au BufRead * :echomsg "diff:" &diff'
--cmd 'echomsg "diffinit:" join(map(range(1, winnr("$")),
"getwinvar(v:val, \"&diff\")"))' -d /tmp/a.py /tmp/b.py
will show you that first window was created immediately and with &diff
already on, second window is created later and &diff is set to zero at
least when file is read and also then when filetype plugins are
sourced after detecting filetype).
Note: only *one* window has this property, and only when using vimdiff
(via explicit -d switch in my example). Window created with :diffsplit
is also created in non-diff mode which continues at least until
filetype plugins are sourced.
>
>
>> It's pretty easy to be lulled into thinking you need a :diffoff. If you
>> see a bunch of closed folds, you might think that's because you just
>> resolved the last difference, and now it's time to turn diff mode off.
If you have resolved all differences you will not see a bunch of
closed folds. There will be *one* fold per window, exactly one and, at
least, in two adjacent windows. I do not see how this makes lulling
easy, at all. Also &foldcolumn needs to be equal to 2 (or whatever
setting in &diffopt) on regular basis because this thing is very
notable.
>>
>> I'm very much hoping that someone who knows how vim code works can make
>> a patch so that :diffoff will only do that resetting if diff mode was ON
>> when :diffoff was called.
>>
>> -Manny
>
>
> --- a/src/diff.c 2015-04-11 08:33:38.074355329 +0200
> +++ b/src/diff.c 2015-06-21 19:59:39.856293311 +0200
> @@ -1138,32 +1138,34 @@ diff_win_options(wp, addbuf)
> curwin = old_curwin;
> # endif
>
> - wp->w_p_diff = TRUE;
> -
> /* Use 'scrollbind' and 'cursorbind' when available */
> #ifdef FEAT_SCROLLBIND
> - if (!wp->w_p_diff_saved)
> + if (!wp->w_p_diff)
> wp->w_p_scb_save = wp->w_p_scb;
> wp->w_p_scb = TRUE;
> #endif
> #ifdef FEAT_CURSORBIND
> - if (!wp->w_p_diff_saved)
> + if (!wp->w_p_diff)
> wp->w_p_crb_save = wp->w_p_crb;
> wp->w_p_crb = TRUE;
> #endif
> - if (!wp->w_p_diff_saved)
> + if (!wp->w_p_diff)
> wp->w_p_wrap_save = wp->w_p_wrap;
> wp->w_p_wrap = FALSE;
> # ifdef FEAT_FOLDING
> curwin = wp;
> curbuf = curwin->w_buffer;
> - if (!wp->w_p_diff_saved)
> + if (!wp->w_p_diff)
> + {
> + if (wp->w_p_diff_saved)
> + free_string_option(wp->w_p_fdm_save);
> wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm);
> + }
> set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
> OPT_LOCAL|OPT_FREE, 0);
> curwin = old_curwin;
> curbuf = curwin->w_buffer;
> - if (!wp->w_p_diff_saved)
> + if (!wp->w_p_diff)
> {
> wp->w_p_fdc_save = wp->w_p_fdc;
> wp->w_p_fen_save = wp->w_p_fen;
> @@ -1183,6 +1185,8 @@ diff_win_options(wp, addbuf)
> /* Saved the current values, to be restored in ex_diffoff(). */
> wp->w_p_diff_saved = TRUE;
>
> + wp->w_p_diff = TRUE;
> +
> if (addbuf)
> diff_buf_add(wp->w_buffer);
> redraw_win_later(wp, NOT_VALID);
> @@ -1226,8 +1230,7 @@ ex_diffoff(eap)
> if (wp->w_p_diff_saved)
> {
> free_string_option(wp->w_p_fdm);
> - wp->w_p_fdm = wp->w_p_fdm_save;
> - wp->w_p_fdm_save = empty_option;
> + wp->w_p_fdm = vim_strsave(wp->w_p_fdm_save);
> }
> else
> set_string_option_direct((char_u *)"fdm", -1,
> @@ -1255,8 +1258,6 @@ ex_diffoff(eap)
> #endif
> /* Note: 'sbo' is not restored, it's a global option. */
> diff_buf_adjust(wp);
> -
> - wp->w_p_diff_saved = FALSE;
> }
> #ifdef FEAT_SCROLLBIND
> diffwin |= wp->w_p_diff;
>
> --
> Olaf Dabrunz (oda <at> fctrace.org)
>
> --
> --
> You received this message from the "vim_dev" maillist.
> Do not top-post! Type your reply below the text you are replying to.
> For more information, visit http://www.vim.org/maillist.php
>
> ---
> You received this message because you are subscribed to the Google Groups
> "vim_dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.