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 -~----------~----~----~----~------~----~------~--~---