Ingo Karkat wrote:

> On 09-Jun-08 22:50, Ingo Karkat wrote:
> > On 09-Jun-08 21:04, Bram Moolenaar wrote:
> >> Ingo Karkat wrote:
> >> 
> >>> I'd like to report a bug that occurs when a very long ex command is 
> >>> entered, so that the GUI / console screen space isn't sufficient to 
> >>> display the complete command.
> >>> 
> >>> I have an external VBScript that uses the VIM OLE SendKeys() function (or
> >>> WshShell.SendKeys() as a fallback) to open a list of files in VIM via: 
> >>> :drop file1 file2 C:/Program\
> >>> Files/this_is_a_very_very_very_long_filename If the list of files is
> >>> longer than the available space for the ex command, the characters that
> >>> didn't fit in are appended in reversed order: :args [file1] file2
> >>> C:/Program\ Fiemanelif_gnol_yrev_yrev_yrev_a_si_siht/sel ^ BUG: reversed
> >>> string!!!                ^
> >>> 
> >>> This happens: - both in GVIM and console VIM - on Windows and Linux -
> >>> through OLE SendKeys(), VIM's feedkeys(<string>,'t'), or by manually 
> >>> typing the string - in VIM 7.1.311 until back to VIM 6.0 Probably, this
> >>> is due to some bad pointer increment, which is hopefully easy to fix.
> >>> 
> >>> Steps to reproduce: ------------------- vim -N -u NONE " Limit window
> >>> size to minimize typing until overflow :-) :set columns=20 lines=4 :drop
> >>> 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890
> >>> 1234567890 1234567890 " Enlarge again to better see the output
> >>> (optional). :set columns=80 :args [1234567890] 1234567890 1234567890
> >>> 1234567890 1234567890 1234567890 12345670987654321 098 " Note the garbled
> >>> strings at the end!
> >>> 
> >>> You can also reproduce without resizing via feedkeys(): gvim -N -u NONE 
> >>> call feedkeys(':drop ', 't') | for i in range(1,500) | call
> >>> feedkeys('1234567890 ', 't') | endfor | call feedkeys("\<CR>", 't') :args
> >>> 
> >> I see the problem.  I think the patch below fixes it properly.
> >> 
> >> 
> >> *** ../vim-7.1.314/src/ex_getln.c  Thu May 29 15:33:13 2008 ---
> >> src/ex_getln.c     Mon Jun  9 20:10:51 2008 *************** *** 2829,2838 
> >> **** 
> >> if (has_mbyte) correct_cmdspos(ccline.cmdpos, c); #endif !                 
> >> /* Stop cursor
> >> at the end of the screen */ !              if (ccline.cmdspos + c >= m) !  
> >>             break;
> >>  !                 ccline.cmdspos += c; #ifdef FEAT_MBYTE if (has_mbyte) { 
> >> --- 2829,2839
> >> ---- if (has_mbyte) correct_cmdspos(ccline.cmdpos, c); #endif !            
> >> /* Stop
> >> cursor at the end of the screen, but do increment the !             * 
> >> insert
> >> position, so that entering a very long command !            * works, even 
> >> though
> >> you can't see it. */ !             if (ccline.cmdspos + c < m) !           
> >>     ccline.cmdspos
> >> += c; #ifdef FEAT_MBYTE if (has_mbyte) {
> >> 
> > 
> > Not quite yet, it's now working in the Linux default "normal" version, but 
> > in
> >  the "big" version, your patch only changes the pattern of character
> > scrambling; it's not plain string reversal anymore. Before the patch (using
> > the 'feedkeys()' example): 1234567890 ... 1234567890 1234567890 0987654321
> > 0987654321 0987654321 0987654321 After the patch: 1234567890 ... 1234567890
> > 1234567890 89674523 190785634120 89674523 190785634120 89674523
> > 
> > I'm just guessing, is there another wrong pointer increment somewhere else?
> > I'm using console VIM "big version" on Linux; here's my :version output:
> > 
> > VIM - Vi IMproved 7.1 (2007 May 12, compiled Jun  9 2008 22:11:08) Included
> > patches: 1-311 Compiled by Ingo Karkat <[EMAIL PROTECTED]> Big version with 
> > GTK2
> > GUI.  Features included (+) or not (-): +arabic +autocmd +balloon_eval
> > +browse ++builtin_terms +byte_offset +cindent +clientserver +clipboard
> > +cmdline_compl +cmdline_hist +cmdline_info +comments +cryptv +cscope
> > +cursorshape +dialog_con_gui +diff +digraphs +dnd -ebcdic +emacs_tags +eval
> > +ex_extra +extra_search +farsi +file_in_path +find_in_path +folding -footer
> > +fork() +gettext -hangul_input +iconv +insert_expand +jumplist +keymap
> > +langmap +libcall +linebreak +lispindent +listcmds +localmap +menu 
> > +mksession
> > +modify_fname +mouse +mouseshape +mouse_dec +mouse_gpm -mouse_jsbterm
> > +mouse_netterm +mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg
> > -osfiletype +path_extra -perl +postscript +printer -profile -python 
> > +quickfix
> > +reltime +rightleft -ruby +scrollbind +signs +smartindent -sniff +statusline
> > -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white -tcl
> > +terminfo +termresponse +textobjects +title +toolbar +user_commands
> > +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore
> > +wildmenu +windows +writebackup +X11 -xfontset +xim +xsmp_interact 
> > +xterm_clipboard -xterm_save system vimrc file: "$VIM/vimrc" user vimrc 
> > file:
> > "$HOME/.vimrc" user exrc file: "$HOME/.exrc" system gvimrc file:
> > "$VIM/gvimrc" user gvimrc file: "$HOME/.gvimrc" system menu file:
> > "$VIMRUNTIME/menu.vim" fall-back for $VIM: "/usr/local/share/vim" 
> > Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK
> > -I/usr/include/g tk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0
> > -I/usr/include/cairo -I /usr/include/pango-1.0 -I/usr/include/glib-2.0
> > -I/usr/lib/glib-2.0/include -I/us r/include/freetype2 
> > -I/usr/include/libpng12
> > -g -O2 Linking: gcc   -L/usr/local/lib -o vim   -lgtk-x11-2.0 -lgdk-x11-2.0
> > -latk-1.0 - lgdk_pixbuf-2.0 -lpangocairo-1.0 -lpango-1.0 -lcairo
> > -lgobject-2.0 -lgmodule-2.0 -lglib-2.0   -lXt -lncurses -lacl -lgpm
> > 
> > -- regards, ingo
> > 
> > /^-- Ingo Karkat -- /^-- /^-- /^-- /^-- /^-- /^-- http://ingo-karkat.de/ --
> > 
> > The goal of science is to build better mousetraps. The goal of nature is to
> > build better mice.
> 
> Hi Bram,
> 
> Your patch from a week ago fixed the reversed string in a long ex command only
> for --with-features=normal. I located the problem that still caused scrambling
> of characters in compiles --with-features=big.
> I've narrowed down the bug to -DFEAT_ARABIC, which is set in the big, but not 
> in
> the normal version. Inside getcmdline(firstc, count, indent), this fragment:
> 
> #ifdef FEAT_RIGHTLEFT
>       if (cmdmsg_rl
> # ifdef FEAT_ARABIC
>               || (p_arshape && !p_tbidi && enc_utf8)
> # endif
>               )
>           /* Always redraw the whole command line to fix shaping and
>            * right-left typing.  Not efficient, but it works. */
>           redrawcmd();
> #endif
> 
> calls redrawcmd(), which, if the cmdline doesn't fit, puts the cursor
> on the last visible char. However, it also decremented the current
> cursor position in that case, which caused the scrambling. I believe
> the cursor position inside the cmdline should not be modified in that
> case.  The patch below contains the complete fix; I've tested on
> Linux/x86, both console and GVIM. I haven't tested rightleft mode or
> Arabic text entry.

Thanks for locating and fixing the problem.  I'll include the patch.

-- 
hundred-and-one symptoms of being an internet addict:
48. You get a tatoo that says "This body best viewed with Netscape 3.1 or
    higher."

 /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui