窗口分割时的Vim缓冲区位置变化(烦恼)

时间:2012-03-08 21:13:45

标签: vim

这真的开始让我感到紧张,这很奇怪,因为这是一个很小的问题。

假设我开始(g)vim 7.3(windows OR linux)没有插件/没有vimrc。我打开一个较长的文件,向下滚动一半。我将光标定位在主窗口的底部。我打开一个垂直分割窗口(CTRL + W v)。

接下来发生的事情就是杀了我。光标和它所在的行(之前位于原始窗口的底部)向上跳跃到窗口的顶部。右侧的新窗口具有原始位置,光标所在的行位于原始窗口中。

enter image description here

我的问题:如何让vim不要更改我分割的窗口的光标位置?老实说,如果位置在 new 窗口中发生变化,我根本不在乎,但拆分改变原来窗口的事实让我想要撕掉我的头发。

过去完全可以忽略。然后我有点恼火。然后我慢慢开始变得非常生气。现在它开始让我愤怒。任何帮助/技巧/黑客都非常感谢!!

编辑:我的Windows和Linux的vim构建选项(发生在两者上):

视窗:

+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     

2 个答案:

答案 0 :(得分:9)

我可以重现这种行为,你的描述(乍一看)出现确实是一个错误。但我注意到以下几点:

  • :vert split ^ W v

  • 的行为相同
  • :debug ver split(... cont)确认没有明显的脚本/自动命令干扰

  • 它只在第一次分裂时发生。换句话说,这是一个解决方法: ^ W v ^ W c ^ W v

  • 光标实际上原始窗口中移动。 “新窗口”出现在左侧(您将其命名为原始窗口)。这不能用:echo winnr()或类似的方式显示,但您可以通过例如:vert new代替:vert split:新的空窗口显示在左侧。

而不是这样,你可能会通过做一些“无用的”之前欺骗分裂来实现“第二次分裂”行为

 :tabnew|bwipeout

现在, ^ W v 首次出现所需行为。


TL; DR

  1. 这不是一个错误(你对窗口关闭的期望是什么)
  2. 你可以通过之前创建另一个窗口来解决它。

  3. 其他背景

    1. splitrightsplitbelow选项

        

      可用于控制(在某种程度上)新创建(拆分)窗口的位置

    2. winrestview()功能

        

      可用于明确恢复窗口的精确视图。像这样使用它:

        :let savex=winsaveview()
      
           

      savex现在包含描述当前视图状态的 {'lnum': 1, 'leftcol': 0, 'col': 0, 'topfill': 0, 'topline': 1, 'coladd': 0, 'skipcol': 0, 'curswant': 0}

           

      (做点什么,比如 ^ W v

        :call winrestview(savex)
      
           

      这显然更灵活,但您可能不需要它。

答案 1 :(得分:1)

我在gvim的Windows计算机上对其进行了测试,可以重现您的问题,这是一个解决方法,可以为我添加vimrc的下一个命令(我用:e $MYVIMRC得到它) :

set splitright

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

nmap <C-w>v :call MySplit()<CR>