# HG changeset patch # User vimboss # Date 1134769771 0 # Node ID 111509d2767a187b0967e2efaa866c621aac98b5 # Parent bc7ec0f1f7f35c3b58b3e32bd2ba1b87501b17d9 updated for version 7.0171 diff --git a/runtime/macros/editexisting.vim b/runtime/macros/editexisting.vim --- a/runtime/macros/editexisting.vim +++ b/runtime/macros/editexisting.vim @@ -1,9 +1,10 @@ " Vim Plugin: Edit the file with an existing Vim if possible " Maintainer: Bram Moolenaar -" Last Change: 2005 Dec 11 +" Last Change: 2005 Dec 15 " This is a plugin, drop it in your (Unix) ~/.vim/plugin or (Win32) -" $VIM/vimfiles/plugin directory. +" $VIM/vimfiles/plugin directory. Or make a symbolic link, so that you +" automatically use the latest version. " This plugin serves two purposes: " 1. On startup, if we were invoked with one file name argument and the file @@ -43,13 +44,15 @@ func s:EditElsewhere(filename) endif call remote_expr(servername, "foreground()") - " Make sure the file is visible in a window (not hidden). - " If v:swapcommand exists and is set, send it to the server. - if exists("v:swapcommand") - let c = substitute(v:swapcommand, "'", "''", "g") - call remote_expr(servername, "EditExisting('" . fname_esc . "', '" . c . "')") - else - call remote_expr(servername, "EditExisting('" . fname_esc . "', '')") + if remote_expr(servername, "exists('*EditExisting')") + " Make sure the file is visible in a window (not hidden). + " If v:swapcommand exists and is set, send it to the server. + if exists("v:swapcommand") + let c = substitute(v:swapcommand, "'", "''", "g") + call remote_expr(servername, "EditExisting('" . fname_esc . "', '" . c . "')") + else + call remote_expr(servername, "EditExisting('" . fname_esc . "', '')") + endif endif if !(has('vim_starting') && has('gui_running') && has('gui_win32')) diff --git a/runtime/syntax/sed.vim b/runtime/syntax/sed.vim --- a/runtime/syntax/sed.vim +++ b/runtime/syntax/sed.vim @@ -2,7 +2,7 @@ " Language: sed " Maintainer: Haakon Riiser " URL: http://folk.uio.no/hakonrk/vim/syntax/sed.vim -" Last Change: 2003 May 11 +" Last Change: 2005 Dec 15 " For version 5.x: Clear all syntax items " For version 6.x: Quit when a syntax file was already loaded @@ -21,7 +21,7 @@ syn match sedAddress "\d\+\~\d\+" syn region sedAddress matchgroup=Special start="[{,;]\s*/\(\\/\)\="lc=1 skip="[^\\]\(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta syn region sedAddress matchgroup=Special start="^\s*/\(\\/\)\=" skip="[^\\]\(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta syn match sedComment "^\s*#.*$" -syn match sedFunction "[dDgGhHlnNpPqx=]\s*\($\|;\)" contains=sedSemicolon,sedWhitespace +syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\($\|;\)" contains=sedSemicolon,sedWhitespace syn match sedLabel ":[^;]*" syn match sedLineCont "^\(\\\\\)*\\$" contained syn match sedLineCont "[^\\]\(\\\\\)*\\$"ms=e contained diff --git a/src/buffer.c b/src/buffer.c --- 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 --- 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 --- 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 --- 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 --- 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 --- 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"