Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vim buffer position change on window split (annoyance)

Tags:

vim

This is really starting to get on my nerves, which is weird because it's such a small issue.

Let's say I start (g)vim 7.3 (windows OR linux) with no plugins/no vimrc. I open a longer file, scroll down halfway. I position my cursor at the bottom of the main window. I open a vertical split window (CTRL+W v).

What happens next is killing me. The cursor and the line it's on (previously at the bottom of the original window) jump up to the top of the window. The new window on the right has the original position where the line the cursor is on was in the original window.

enter image description here

My question: How do I keep vim from changing the cursor position of the window I split? Honestly, I wouldn't care at all if the position changed in the new window, but the fact that splitting changes the original window is making me want to tear my hair out.

It used to be completely ignorable. Then I got kind of annoyed. Then I slowly started getting really annoyed. Now it's starting to make me furious. Any help/tricks/hacks are greatly appreciated!!

EDIT: My vim build options for both Windows and Linux (happening on both):

Windows:

+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 +gettext/dyn -hangul_input +iconv/dyn
+insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape
+multi_byte +multi_lang -mzscheme -netbeans_intg -osfiletype +path_extra -perl
+persistent_undo -postscript +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 -tgetent -termresponse +textobjects +title -toolbar +user_commands
+vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore
+wildmenu +windows +writebackup -xfontset -xim -xterm_save -xpm_w32
   system vimrc file: "$VIM\vimrc"
     user vimrc file: "$HOME\_vimrc"
 2nd user vimrc file: "$VIM\_vimrc"
      user exrc file: "$HOME\_exrc"
  2nd user exrc file: "$VIM\_exrc"
Compilation: cl -c /W3 /nologo  -I. -Iproto -DHAVE_PATHDEF -DWIN32   -DFEAT_CSCOPE       -DWINVER=0x0400 -D_WIN32_WINNT=0x0400  /Fo.\ObjC/ /Ox /GL -DNDEBUG  /Zl /MT -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_BIG /Fd.\ObjC/ /Zi
Linking: link /RELEASE /nologo /subsystem:console /LTCG:STATUS oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib  comdlg32.lib ole32.lib uuid.lib /machine:i386 /nodefaultlib  libcmt.lib   user32.lib             /PDB:vim.pdb -debug

Linux:

-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_gui +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_sysmouse +mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg 
-osfiletype +path_extra -perl +persistent_undo +postscript +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: "$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/gtk-2.0 -I/usr/lib64/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/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng14     -g -O2 -D_FORTIFY_SOURCE=1      
Linking: gcc   -L/usr/local/lib -o vim   -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0   -lXt -lncurses -lacl -lgpm     -L/usr/lib64/python2.6/config -lpython2.6 -lpthread -lutil -lm -Xlinker -export-dynamic     
like image 479
andrew Avatar asked Mar 08 '12 21:03

andrew


2 Answers

I can reproduce the behaviour, which with your description would (at first sight) appear to be a bug, indeed. But I noticed the following things:

  • :vert split has the same behaviour as ^Wv

  • :debug ver split (... cont) confirmed there wasn't an obvious script/autocommand interfering

  • It only happens on the first time split. In other words, this is a workaround: ^Wv^Wc^Wv

  • the cursor does in fact not move in the original window. The 'new window' appears on the left (which you name the original window). This cannot be shown with :echo winnr() or similar, but you can make it more apparent by doing e.g. :vert new instead of :vert split: the new, empty window appears on the left side.

Instead of this, you might trick the split to have 'second split' behaviour by doing something 'useless' before

 :tabnew|bwipeout

Now, ^Wv has the desired behaviour first time around.


TL;DR

  1. it was not a bug (your expectations on what was the new window were off)
  2. you can work around it by creating another window before.

Other background

  1. The splitright, splitbelow options

    can be used to control (to an extent) where newly created (split) windows appear

  2. The winrestview() function

    Can be used to explicitely restore the exact view of a window. Use it like so:

      :let savex=winsaveview()
    

    savex now contains something like {'lnum': 1, 'leftcol': 0, 'col': 0, 'topfill': 0, 'topline': 1, 'coladd': 0, 'skipcol': 0, 'curswant': 0} describing the state of the current view.

    (do stuff, like ^Wv)

      :call winrestview(savex)
    

    This is obviously a lot more flexible but you might not need it.

like image 73
sehe Avatar answered Nov 10 '22 00:11

sehe


I tested it on a Windows machine with gvim and could reproduce your problem, here is a workaround that worked for me adding next commands to vimrc (I got it with :e $MYVIMRC):

set splitright

function MySplit()
    vsplit
    execute "normal \<C-w>\<C-w>"
endfunction

nmap <C-w>v :call MySplit()<CR>
like image 23
Birei Avatar answered Nov 10 '22 02:11

Birei