diff options
author | Bram Moolenaar <Bram@vim.org> | 2005-12-16 21:49:31 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2005-12-16 21:49:31 +0000 |
commit | 12033fb4bfa58447ba89104ff671a076e756b8e6 (patch) | |
tree | 3a109c25124eea7e67e2b2a6a02db9db18bb7a2c /src | |
parent | bca84a12bdbb4bb33e9ba32bfe320abbf54ae5fb (diff) | |
download | vim-git-12033fb4bfa58447ba89104ff671a076e756b8e6.tar.gz |
updated for version 7.0171
Diffstat (limited to 'src')
-rw-r--r-- | src/buffer.c | 3 | ||||
-rw-r--r-- | src/normal.c | 6 | ||||
-rw-r--r-- | src/os_unix.c | 54 | ||||
-rw-r--r-- | src/tag.c | 3 | ||||
-rw-r--r-- | src/vim.h | 2 | ||||
-rw-r--r-- | src/xxd/xxd.c | 14 |
6 files changed, 55 insertions, 27 deletions
diff --git a/src/buffer.c b/src/buffer.c index 0c1915b4a..f252489c2 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -681,6 +681,7 @@ goto_buffer(eap, start, dir, count) /* Quitting means closing the split window, nothing else. */ win_close(curwin, TRUE); swap_exists_action = SEA_NONE; + swap_exists_did_quit = TRUE; # if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) /* Restore the error/interrupt/exception state if not discarded by a @@ -719,6 +720,7 @@ handle_swap_exists(old_curbuf) * buffer. If that buffer is gone or the same as the current one, * open a new, empty buffer. */ swap_exists_action = SEA_NONE; /* don't want it again */ + swap_exists_did_quit = TRUE; close_buffer(curwin, curbuf, DOBUF_UNLOAD); if (!buf_valid(old_curbuf) || old_curbuf == curbuf) old_curbuf = buflist_new(NULL, NULL, 1L, BLN_CURBUF | BLN_LISTED); @@ -4402,6 +4404,7 @@ ex_buffer_all(eap) win_close(curwin, TRUE); --open_wins; swap_exists_action = SEA_NONE; + swap_exists_did_quit = TRUE; # if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) /* Restore the error/interrupt/exception state if not diff --git a/src/normal.c b/src/normal.c index dfd2f0dfe..2526de379 100644 --- a/src/normal.c +++ b/src/normal.c @@ -2108,7 +2108,7 @@ op_colon(oap) } /* - * Handle the "gy" operator: call 'operatorfunc'. + * Handle the "g@" operator: call 'operatorfunc'. */ /*ARGSUSED*/ void @@ -7724,7 +7724,7 @@ nv_g_cmd(cap) * "gu" Change text to lower case. * "gU" Change text to upper case. * "g?" rot13 encoding - * "gy" call 'operatorfunc' + * "g@" call 'operatorfunc' */ case 'q': case 'w': @@ -7734,7 +7734,7 @@ nv_g_cmd(cap) case 'u': case 'U': case '?': - case 'y': + case '@': nv_operator(cap); break; diff --git a/src/os_unix.c b/src/os_unix.c index 89c420d99..6165e9f6a 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3539,7 +3539,7 @@ mch_call_shell(cmd, options) int pty_slave_fd = -1; char *tty_name; # endif - int fd_toshell[2]; /* for pipes */ + int fd_toshell[2]; /* for pipes */ int fd_fromshell[2]; int pipe_error = FALSE; # ifdef HAVE_SETENV @@ -3548,19 +3548,21 @@ mch_call_shell(cmd, options) static char envbuf_Rows[20]; static char envbuf_Columns[20]; # endif - int did_settmode = FALSE; /* TRUE when settmode(TMODE_RAW) called */ + int did_settmode = FALSE; /* settmode(TMODE_RAW) called */ out_flush(); if (options & SHELL_COOKED) settmode(TMODE_COOK); /* set to normal mode */ - /* - * 1: find number of arguments - * 2: separate them and built argv[] - */ newcmd = vim_strsave(p_sh); if (newcmd == NULL) /* out of memory */ goto error; + + /* + * Do this loop twice: + * 1: find number of arguments + * 2: separate them and build argv[] + */ for (i = 0; i < 2; ++i) { p = newcmd; @@ -3655,6 +3657,7 @@ mch_call_shell(cmd, options) # ifdef __BEOS__ beos_cleanup_read_thread(); # endif + if ((pid = fork()) == -1) /* maybe we should use vfork() */ { MSG_PUTS(_("\nCannot fork\n")); @@ -3728,17 +3731,24 @@ mch_call_shell(cmd, options) { # ifdef HAVE_SETSID - (void)setsid(); + /* Create our own process group, so that the child and all its + * children can be kill()ed. Don't do this when using pipes, + * because stdin is not a tty, we would loose /dev/tty. */ + if (p_stmp) + (void)setsid(); # endif # ifdef FEAT_GUI - /* push stream discipline modules */ - if (options & SHELL_COOKED) - SetupSlavePTY(pty_slave_fd); + if (pty_slave_fd >= 0) + { + /* push stream discipline modules */ + if (options & SHELL_COOKED) + SetupSlavePTY(pty_slave_fd); # ifdef TIOCSCTTY - /* try to become controlling tty (probably doesn't work, - * unless run by root) */ - ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL); + /* Try to become controlling tty (probably doesn't work, + * unless run by root) */ + ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL); # endif + } # endif /* Simulate to have a dumb terminal (for now) */ # ifdef HAVE_SETENV @@ -3895,7 +3905,7 @@ mch_call_shell(cmd, options) old_State = State; State = EXTERNCMD; /* don't redraw at window resize */ - if (options & SHELL_WRITE && toshell_fd >= 0) + if ((options & SHELL_WRITE) && toshell_fd >= 0) { /* Fork a process that will write the lines to the * external program. */ @@ -3976,6 +3986,8 @@ mch_call_shell(cmd, options) * Don't do this when filtering and terminal is in cooked * mode, the shell command will handle the I/O. Avoids * that a typed password is echoed for ssh or gpg command. + * Don't get characters when the child has already + * finished (wait_pid == 0). * Don't get extra characters when we already have one. * Don't read characters unless we didn't get output for a * while, avoids that ":r !ls" eats typeahead. @@ -3989,6 +4001,7 @@ mch_call_shell(cmd, options) || gui.in_use #endif ) + && wait_pid == 0 && (ta_len > 0 || (noread_cnt > 4 && (len = ui_inchar(ta_buf, @@ -4207,6 +4220,11 @@ mch_call_shell(cmd, options) break; } + /* If we already detected the child has finished break the + * loop now. */ + if (wait_pid == pid) + break; + /* * Check if the child still exists, before checking for * typed characters (otherwise we would loose typeahead). @@ -4219,10 +4237,14 @@ mch_call_shell(cmd, options) if ((wait_pid == (pid_t)-1 && errno == ECHILD) || (wait_pid == pid && WIFEXITED(status))) { + /* Don't break the loop yet, try reading more + * characters from "fromshell_fd" first. When using + * pipes there might still be something to read and + * then we'll break the loop at the "break" above. */ wait_pid = pid; - break; } - wait_pid = 0; + else + wait_pid = 0; } finished: p_more = p_more_save; @@ -2419,7 +2419,8 @@ get_tagfname(first, buf) , TRUE, found_tagfile_cb, NULL); hf_idx = 0; } - else if (hf_idx >= tag_fnames.ga_len) + + if (hf_idx >= tag_fnames.ga_len) { /* Not found in 'runtimepath', use 'helpfile', if it exists and * wasn't used yet, replacing "help.txt" with "tags". */ @@ -1201,7 +1201,7 @@ typedef enum #define OP_FOLDDEL 24 /* "zd" delete folds */ #define OP_FOLDDELREC 25 /* "zD" delete folds recursively */ #define OP_FORMAT2 26 /* "gw" format operator, keeps cursor pos */ -#define OP_FUNCTION 27 /* "gy" call 'operatorfunc' */ +#define OP_FUNCTION 27 /* "g@" call 'operatorfunc' */ /* * Motion types, used for operators and for yank/delete registers. diff --git a/src/xxd/xxd.c b/src/xxd/xxd.c index 299ba37f7..2b553dd6b 100644 --- a/src/xxd/xxd.c +++ b/src/xxd/xxd.c @@ -146,16 +146,18 @@ char osver[] = ""; #if !defined(CYGWIN) && (defined(CYGWIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__)) # define CYGWIN #endif -#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(CYGWIN) +#if defined(MSDOS) || defined(WIN32) || defined(OS2) # define BIN_READ(yes) ((yes) ? "rb" : "rt") # define BIN_WRITE(yes) ((yes) ? "wb" : "wt") # define BIN_CREAT(yes) ((yes) ? (O_CREAT|O_BINARY) : O_CREAT) # define BIN_ASSIGN(fp, yes) setmode(fileno(fp), (yes) ? O_BINARY : O_TEXT) -# if defined(CYGWIN) -# define PATH_SEP '/' -# else -# define PATH_SEP '\\' -# endif +# define PATH_SEP '\\' +#elif defined(CYGWIN) +# define BIN_READ(yes) ((yes) ? "rb" : "rt") +# define BIN_WRITE(yes) ((yes) ? "wb" : "w") +# define BIN_CREAT(yes) ((yes) ? (O_CREAT|O_BINARY) : O_CREAT) +# define BIN_ASSIGN(fp, yes) ((yes) ? (void) setmode(fileno(fp), O_BINARY) : (void) (fp)) +# define PATH_SEP '/' #else # ifdef VMS # define BIN_READ(dummy) "r" |