summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2005-12-16 21:49:31 +0000
committerBram Moolenaar <Bram@vim.org>2005-12-16 21:49:31 +0000
commit12033fb4bfa58447ba89104ff671a076e756b8e6 (patch)
tree3a109c25124eea7e67e2b2a6a02db9db18bb7a2c /src
parentbca84a12bdbb4bb33e9ba32bfe320abbf54ae5fb (diff)
downloadvim-git-12033fb4bfa58447ba89104ff671a076e756b8e6.tar.gz
updated for version 7.0171
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c3
-rw-r--r--src/normal.c6
-rw-r--r--src/os_unix.c54
-rw-r--r--src/tag.c3
-rw-r--r--src/vim.h2
-rw-r--r--src/xxd/xxd.c14
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;
diff --git a/src/tag.c b/src/tag.c
index 440e220e8..a9d4d7555 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -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". */
diff --git a/src/vim.h b/src/vim.h
index 69092ee7b..9fc38f52f 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -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"