On 2013-02-06 Wednesday at 23:08 +0100 Bram Moolenaar wrote:
> Roland Eggner wrote:
> > > > :mksession writes wrong column number of cursor position in presence of 
> > > > multibyte characters.
> > > > 
> > > > I have been using vim-7.3.135 with this patch applied for several
> > > > months  … it works for me:
> > > 
> > > I do not see the problem.  How to reproduce?
> > > 
> > > Your patch can't be right, the "l" command moves over characters, not
> > > columns.
> > 
> > Session files created with :mksession restore cursor line and column,
> > as long as there is no multibyte character between start of line and
> > cursor.  Otherwise, without my patch restored column is off by the
> > difference between character position and byte position counted from
> > start of line.
> > 
> > With my patch applied, cursor line and column is restored correctly,
> > with and without multibyte characters, with and without changing of
> > options fileencoding or binary, even with files preprocessed by
> > BufRead autocommands gzip -dc, bzip -dc, xz -dc, pdftotext, elinks
> > -dump, antiword, … which I find pretty cool, use and enjoy it nearly
> > every day.
> 
> I asked how to reproduce.  I suspect your 'encoding' matters.
> Please start with "vim -u NONE" and check what the default value of
> 'encoding' is then.
> 
> Note that your patch most likely is wrong when there is a Tab before the
> cursor, try that.

Indeed, you are right:  my patch beeing wrong was hidden by autocommands 
restoring cursor positions based on textmarks.

For investigation of the problem I have created test{91,92}.
In my environment (TERM=linux, unicode-mode) and with locale 
en_US.ISO-8859-1 both succeed, whereas with locale en_US.utf8 both fail:


pushd vim-7.3.816
patch -p1 -N -u -i my.patch.provided.below
pushd src/testdir
rm -f test{91,92}.{out,failed,messages}
env {LANG,LC_CTYPE,LC_MESSAGES}=en_US.ISO-8859-1 make -j1

  Test results:
  ALL DONE

grep '[=.]' test91.messages
  LANG=en_US.ISO-8859-1
  LC_MESSAGES=en_US.ISO-8859-1
  LC_ALL=
  test91.in
    fileencoding=utf-8
    termencoding=
    encoding=latin1

grep '[=.]' test92.messages
  LANG=en_US.ISO-8859-1
  LC_MESSAGES=en_US.ISO-8859-1
  LC_ALL=
  test92.in
    fileencoding=latin1
    termencoding=
    encoding=latin1


rm -f test{91,92}.{out,failed,messages}
env {LANG,LC_CTYPE,LC_MESSAGES}=en_US.utf8 make -j1

  Test results:
  test91 FAILED
  test92 FAILED

diff -u test91.{failed,ok}
> --- test91.failed       2013-02-16 01:45:55.979190588 +0100
> +++ test91.ok   2013-02-15 20:36:45.226981063 +0100
> @@ -1,6 +1,6 @@
>  normal! 06l
>  normal! 06l
>  normal! 06l
> -normal! 08l
> -normal! 09l
> -normal! 011l
> +normal! 06l
> +normal! 06l
> +normal! 06l

diff -u test92.{failed,ok}
> --- test92.failed       2013-02-16 01:45:56.363190562 +0100
> +++ test92.ok   2013-02-15 20:36:45.226981063 +0100
> @@ -1,6 +1,6 @@
>  normal! 06l
>  normal! 06l
>  normal! 06l
> -normal! 07l
> -normal! 08l
> -normal! 09l
> +normal! 06l
> +normal! 06l
> +normal! 06l

grep '[=.]' test91.messages
  LANG=en_US.utf8
  LC_MESSAGES=en_US.utf8
  LC_ALL=
  test91.in
    fileencoding=utf-8
    termencoding=
    encoding=utf-8

grep '[=.]' test92.messages
  LANG=en_US.utf8
  LC_MESSAGES=en_US.utf8
  LC_ALL=
  test92.in
    fileencoding=latin1
    termencoding=
    encoding=utf-8

env LC_MESSAGES=C ../vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Feb 15 2013 20:37:25)
Included patches: 1-816
Modified by Gentoo-7.3.816-<od...@systomanalyson.not s/o/e/g>
Compiled by <od...@systomanalyson.not s/o/e/g>
Huge version without GUI.  Features included (+) or not (-):
-arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent
-clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
+conceal -cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs
-dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path
+find_in_path +float +folding -footer +fork() +gettext -hangul_input +iconv
+insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape
+mouse_dec -mouse_gpm -mouse_jsbterm +mouse_netterm +mouse_sgr -mouse_sysmouse
+mouse_urxvt +mouse_xterm +multi_byte +multi_lang -mzscheme -netbeans_intg
+path_extra +perl -persistent_undo -printer +profile +python -python3 +quickfix
 +reltime -rightleft -ruby +scrollbind +signs +smartindent -sniff +startuptime
+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: "/etc/vim/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: x86_64-pc-linux-gnu-gcc -c -I. -Iproto -DHAVE_CONFIG_H     -O2
-march=native -pipe -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: x86_64-pc-linux-gnu-gcc   -Wl,-E  -Wl,-O1 -Wl,--as-needed
-L/usr/local/lib -Wl,--as-needed -o vim    -lSM -lICE -lXpm -lXt -lX11 -lXdmcp
-lSM -lICE  -lm   -lcurses -ldl   -Wl,-E -Wl,-O1 -Wl,--as-needed
-L/usr/lib64/perl5/5.12.3/x86_64-linux/CORE -lperl -lnsl -ldl -lm -lcrypt -lutil
-lc -L/usr/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker
-export-dynamic


-------------------
-- bugreport END --
-------------------

src/testdir/Make_amiga.mak |   4 ++-
src/testdir/Make_dos.mak   |   2 +-
src/testdir/Make_ming.mak  |   2 +-
src/testdir/Make_os2.mak   |   2 +-
src/testdir/Make_vms.mms   |   2 +-
src/testdir/Makefile       |   8 +++---
src/testdir/test91.in      |  50 ++++++++++++++++++++++++++++++++++++++++++++++
src/testdir/test91.ok      |   6 +++++
src/testdir/test92.in      |  50 ++++++++++++++++++++++++++++++++++++++++++++++
src/testdir/test92.ok      |   6 +++++
10 files changed, 123 insertions(+), 9 deletions(-)

-------------------------------------------------------------
-- patch START -- when read by vim, binary mode  __REQUIRED__
-------------------------------------------------------------
>From: Roland Eggner <ed...@systemanalysen.net>
test if :mksession saves cursor columns correctly in presence of tab and 
multibyte characters

diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak
--- a/src/testdir/Make_amiga.mak
+++ b/src/testdir/Make_amiga.mak
@@ -32,7 +32,7 @@ SCRIPTS = test1.out test3.out test4.out 
                test71.out test72.out test73.out test74.out test75.out \
                test76.out test77.out test78.out test79.out test80.out \
                test81.out test82.out test83.out test84.out test88.out \
-               test89.out test90.out
+               test89.out test90.out test91.out test92.out
 
 .SUFFIXES: .in .out
 
@@ -139,3 +139,5 @@ test84.out: test84.in
 test88.out: test88.in
 test89.out: test89.in
 test90.out: test90.in
+test91.out: test91.in
+test92.out: test92.in
diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak
--- a/src/testdir/Make_dos.mak
+++ b/src/testdir/Make_dos.mak
@@ -31,7 +31,7 @@ SCRIPTS =     test3.out test4.out test5.out 
                test74.out test75.out test76.out test77.out test78.out \
                test79.out test80.out test81.out test82.out test83.out \
                test84.out test85.out test86.out test87.out test88.out \
-               test89.out test90.out
+               test89.out test90.out test91.out test92.out
 
 SCRIPTS32 =    test50.out test70.out
 
diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak
--- a/src/testdir/Make_ming.mak
+++ b/src/testdir/Make_ming.mak
@@ -51,7 +51,7 @@ SCRIPTS =     test3.out test4.out test5.out 
                test74.out test75.out test76.out test77.out test78.out \
                test79.out test80.out test81.out test82.out test83.out \
                test84.out test85.out test86.out test87.out test88.out \
-               test89.out test90.out
+               test89.out test90.out test91.out test92.out
 
 SCRIPTS32 =    test50.out test70.out
 
diff --git a/src/testdir/Make_os2.mak b/src/testdir/Make_os2.mak
--- a/src/testdir/Make_os2.mak
+++ b/src/testdir/Make_os2.mak
@@ -32,7 +32,7 @@ SCRIPTS = test1.out test3.out test4.out 
                test71.out test72.out test73.out test74.out test75.out \
                test76.out test77.out test78.out test79.out test80.out \
                test81.out test82.out test83.out test84.out test88.out \
-               test89.out test90.out
+               test89.out test90.out test91.out test92.out
 
 .SUFFIXES: .in .out
 
diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -77,7 +77,7 @@ SCRIPT = test1.out  test2.out  test3.out
         test71.out test72.out test74.out test75.out test76.out \
         test77.out test78.out test79.out test80.out test81.out \
         test82.out test83.out test84.out test88.out test89.out \
-        test90.out
+        test90.out test91.out test92.out
 
 # Known problems:
 # Test 30: a problem around mac format - unknown reason
diff --git a/src/testdir/Makefile b/src/testdir/Makefile
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -28,7 +28,7 @@ SCRIPTS = test1.out test2.out test3.out 
                test74.out test75.out test76.out test77.out test78.out \
                test79.out test80.out test81.out test82.out test83.out \
                test84.out test85.out test86.out test87.out test88.out \
-               test89.out test90.out
+               test89.out test90.out test91.out test92.out
 
 SCRIPTS_GUI = test16.out
 
@@ -58,7 +58,7 @@ clean:
 test1.out: test1.in
        -rm -rf $*.failed $(RM_ON_RUN) $(RM_ON_START)
        $(RUN_VIM) $*.in
-       @/bin/sh -c "if diff test.out $*.ok; \
+       @/bin/sh -c "if diff -u test.out $*.ok; \
                then mv -f test.out $*.out; \
                else echo; \
                echo test1 FAILED - Something basic is wrong; \
@@ -74,7 +74,7 @@ test1.out: test1.in
 
        # For flaky tests retry one time.
        @/bin/sh -c "if test -f test.out -a $* = test61; then \
-                 if diff test.out $*.ok; \
+                 if diff -u test.out $*.ok; \
                  then echo flaky test ok first time; \
                  else rm -rf $*.failed $(RM_ON_RUN); \
                        $(RUN_VIM) $*.in; \
@@ -83,7 +83,7 @@ test1.out: test1.in
 
        # Check if the test.out file matches test.ok.
        @/bin/sh -c "if test -f test.out; then\
-                 if diff test.out $*.ok; \
+                 if diff -u test.out $*.ok; \
                  then mv -f test.out $*.out; \
                  else echo $* FAILED >>test.log; mv -f test.out $*.failed; \
                  fi \
diff --git a/src/testdir/test91.in b/src/testdir/test91.in
new file mode 100644
--- /dev/null
+++ b/src/testdir/test91.in
@@ -0,0 +1,50 @@
+vim: set ft=vim fenc=utf-8:
+
+Tests if :mksession saves cursor columns correctly in presence of tab and 
+multibyte characters when fileencoding=utf-8.
+
+STARTTEST
+:so mbyte.vim
+:if !has('mksession')
+   e! test.ok
+   wq! test.out
+:endif
+:set sessionoptions=buffers splitbelow fileencoding=utf-8
+:" debugging stuff START
+:redir > test91.messages
+:echo 'LANG=' . ( exists('$LANG') ? $LANG : '' )
+:echo 'LC_MESSAGES=' . ( exists('$LC_MESSAGES') ? $LC_MESSAGES : '' )
+:echo 'LC_ALL=' . ( exists('$LC_ALL') ? $LC_ALL : '' )
+:echo bufname('%')
+:set fileencoding? termencoding? encoding?
+:redir END
+:" debugging stuff END
+:" Start test.  For each of 6 test text lines create another window and 
position 
+:" the cursor at column 7.  Session file written by :mksession must contain 
six 
+:" lines “normal! 06l”, we delete deviating lines and save result as 
“test.out”. 
+:" For debugging purpose additionally report &{file,term,}encoding.
+/^start:
+:normal j06l
+:split
+:normal j06l
+:split
+:normal j06l
+:split
+:normal j06l
+:split
+:normal j06l
+:split
+:normal j06l
+:mksession! test.out
+:e! test.out
+:v/^normal! 0/d
+:wqa!
+ENDTEST
+
+start:
+no multibyte character
+       one tab
+two            tabs
+one … multibyte character
+a “b” two multibyte characters
+“c”1€ three multibyte characters
diff --git a/src/testdir/test91.ok b/src/testdir/test91.ok
new file mode 100644
--- /dev/null
+++ b/src/testdir/test91.ok
@@ -0,0 +1,6 @@
+normal! 06l
+normal! 06l
+normal! 06l
+normal! 06l
+normal! 06l
+normal! 06l
diff --git a/src/testdir/test92.in b/src/testdir/test92.in
new file mode 100644
--- /dev/null
+++ b/src/testdir/test92.in
@@ -0,0 +1,50 @@
+vim: set ft=vim fenc=latin1:
+
+Tests if :mksession saves cursor columns correctly in presence of tab and 
+multibyte characters when fileencoding=latin1.
+
+STARTTEST
+:so mbyte.vim
+:if !has('mksession')
+   e! test.ok
+   wq! test.out
+:endif
+:set sessionoptions=buffers splitbelow fileencoding=latin1
+:" debugging stuff START
+:redir > test92.messages
+:echo 'LANG=' . ( exists('$LANG') ? $LANG : '' )
+:echo 'LC_MESSAGES=' . ( exists('$LC_MESSAGES') ? $LC_MESSAGES : '' )
+:echo 'LC_ALL=' . ( exists('$LC_ALL') ? $LC_ALL : '' )
+:echo bufname('%')
+:set fileencoding? termencoding? encoding?
+:redir END
+:" debugging stuff END
+:" Start test.  For each of 6 test text lines create another window and 
position 
+:" the cursor at column 7.  Session file written by :mksession must contain 
six 
+:" lines 'normal! 06l', we delete deviating lines and save result as 
'test.out'. 
+:" For debugging purpose additionally report &{file,term,}encoding.
+/^start:
+:normal j06l
+:split
+:normal j06l
+:split
+:normal j06l
+:split
+:normal j06l
+:split
+:normal j06l
+:split
+:normal j06l
+:mksession! test.out
+:e! test.out
+:v/^normal! 0/d
+:wqa!
+ENDTEST
+
+start:
+no multibyte character
+       one tab
+two            tabs
+one � multibyte character
+a� �  two multibyte characters
+A���  three multibyte characters
diff --git a/src/testdir/test92.ok b/src/testdir/test92.ok
new file mode 100644
--- /dev/null
+++ b/src/testdir/test92.ok
@@ -0,0 +1,6 @@
+normal! 06l
+normal! 06l
+normal! 06l
+normal! 06l
+normal! 06l
+normal! 06l

-- 
Roland Eggner

Attachment: pgp413pD3YJzl.pgp
Description: PGP signature

Reply via email to