# HG changeset patch # User Bram Moolenaar # Date 1554401705 -7200 # Node ID a70f0d6686c43a81625c16b7f7cb8ca1f8490778 # Parent e1e238ab3300176b6acbc794c96e113edc02b85e patch 8.1.1118: a couple of conditions are hard to understand commit https://github.com/vim/vim/commit/652de23dc7abf6aa2721ccee7fe279b5cce8069c Author: Bram Moolenaar Date: Thu Apr 4 20:13:09 2019 +0200 patch 8.1.1118: a couple of conditions are hard to understand Problem: A couple of conditions are hard to understand. Solution: Split the conditions into pieces. (Ozaki Kiichi, closes https://github.com/vim/vim/issues/3879) diff --git a/src/getchar.c b/src/getchar.c --- a/src/getchar.c +++ b/src/getchar.c @@ -2030,6 +2030,8 @@ vgetorpeek(int advance) */ for (;;) { + long wait_time; + /* * ui_breakcheck() is slow, don't use it too often when * inside a mapping. But call it each time for typed @@ -2828,18 +2830,25 @@ vgetorpeek(int advance) // that has a RHS. timedout = FALSE; + if (advance) + { + if (typebuf.tb_len == 0 + || !(p_timeout + || (p_ttimeout && keylen == KEYLEN_PART_KEY))) + // blocking wait + wait_time = -1L; + else if (keylen == KEYLEN_PART_KEY && p_ttm >= 0) + wait_time = p_ttm; + else + wait_time = p_tm; + } + else + wait_time = 0; + wait_tb_len = typebuf.tb_len; c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len, typebuf.tb_buflen - typebuf.tb_off - typebuf.tb_len - 1, - !advance - ? 0 - : ((typebuf.tb_len == 0 - || !(p_timeout || (p_ttimeout - && keylen == KEYLEN_PART_KEY))) - ? -1L - : ((keylen == KEYLEN_PART_KEY && p_ttm >= 0) - ? p_ttm - : p_tm))); + wait_time); #ifdef FEAT_CMDL_INFO if (i != 0) diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -5607,19 +5607,25 @@ mch_job_start(char **argv, job_T *job, j close(fd_err[1]); if (channel != NULL) { - int in_fd = use_file_for_in || use_null_for_in - ? INVALID_FD : fd_in[1] < 0 ? pty_master_fd : fd_in[1]; - int out_fd = use_file_for_out || use_null_for_out - ? INVALID_FD : fd_out[0] < 0 ? pty_master_fd : fd_out[0]; - /* When using pty_master_fd only set it for stdout, do not duplicate it - * for stderr, it only needs to be read once. */ - int err_fd = use_out_for_err || use_file_for_err || use_null_for_err - ? INVALID_FD - : fd_err[0] >= 0 - ? fd_err[0] - : (out_fd == pty_master_fd - ? INVALID_FD - : pty_master_fd); + int in_fd = INVALID_FD; + int out_fd = INVALID_FD; + int err_fd = INVALID_FD; + + if (!(use_file_for_in || use_null_for_in)) + in_fd = fd_in[1] >= 0 ? fd_in[1] : pty_master_fd; + + if (!(use_file_for_out || use_null_for_out)) + out_fd = fd_out[0] >= 0 ? fd_out[0] : pty_master_fd; + + // When using pty_master_fd only set it for stdout, do not duplicate + // it for stderr, it only needs to be read once. + if (!(use_out_for_err || use_file_for_err || use_null_for_err)) + { + if (fd_err[0] >= 0) + err_fd = fd_err[0]; + else if (out_fd != pty_master_fd) + err_fd = pty_master_fd; + } channel_set_pipes(channel, in_fd, out_fd, err_fd); channel_set_job(channel, job, options); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -772,6 +772,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1118, +/**/ 1117, /**/ 1116,