2011/10/2 Yue Wu <[email protected]>:
> Hello list,
>
> I'm running vim in a tmux session in xterm, I find that, when I quit
> Xorg and start it again, then restore tmux session in a xterm, the
> running vim will get mess, the keybindings and functions of the plugins
> will get lost, I have to restart vim to make it back into normal
> condition.
>
> What's wrong?
When X connection lost, Vim uses longjmp() (Jump from
os_unix.c:x_IOerror_handler() to main.c:999).
While processing vgetorpeek(), it may occur.
And when it occur, vgetc_busy global variable is not reset (Normally it
is reset at end of vgetorpeek()).
Then after longjmp(), mappings are never applied because vgetc_busy > 0
is always true.
I think there is other situation that longjmp() breaks something.
main.c:
994 #if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)
995 /* Setup to catch a terminating error from the X server. Just ignore
996 * it, restore the state and continue. This might not always work
997 * properly, but at least we don't exit unexpectedly when the X server
998 * exists while Vim is running in a console. */
999 if (!cmdwin && !noexmode && SETJMP(x_jump_env))
1000 {
1001 State = NORMAL;
1002 # ifdef FEAT_VISUAL
1003 VIsual_active = FALSE;
1004 # endif
1005 got_int = TRUE;
1006 need_wait_return = FALSE;
1007 global_busy = FALSE;
ad-hoc fix.
diff -r 15b934a16641 src/main.c
--- a/src/main.c Wed Sep 14 19:04:40 2011 +0200
+++ b/src/main.c Sun Sep 25 18:50:43 2011 +0900
@@ -1009,6 +1009,7 @@
skip_redraw = FALSE;
RedrawingDisabled = 0;
no_wait_return = 0;
+ vgetc_busy = 0;
# ifdef FEAT_EVAL
emsg_skip = 0;
# endif
--
Yukihiro Nakadaira - [email protected]
--
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