Изменение положения буфера Vim при разделении окна (раздражение) - PullRequest
16 голосов
/ 09 марта 2012

Это действительно начинает действовать мне на нервы, что странно, потому что это такая маленькая проблема.

Допустим, я запускаю (g) vim 7.3 (Windows ИЛИ Linux) без плагинов / без vimrc. Я открываю более длинный файл, прокручиваю вниз на полпути. Я позиционирую свой курсор внизу главного окна. Я открываю вертикальное разделенное окно (CTRL + W v).

То, что происходит дальше, убивает меня. Курсор и линия, на которой он находится (ранее внизу исходного окна) подпрыгивают к верхней части окна. Новое окно справа имеет исходную позицию, в которой линия, на которой находится курсор, была в исходном окне.

enter image description here

Мой вопрос: как мне удержать vim от изменения позиции курсора окна, которое я разделяю? Честно говоря, мне было бы все равно, если позиция изменилась в новом окне, но тот факт, что разделение изменяет исходное окно, заставляет меня хотеть рвать на себе волосы.

Раньше он был полностью игнорируем. Тогда я немного расстроился. Затем я начал медленно раздражаться. Теперь это начинает меня бесить. Любая помощь / хитрости / взломы очень ценятся !!

РЕДАКТИРОВАТЬ: Мои варианты сборки Vim для Windows и Linux (происходит на обоих):

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     

Ответы [ 2 ]

9 голосов
/ 09 марта 2012

Я могу воспроизвести поведение, которое с вашим описанием (на первый взгляд) может показаться ошибкой. Но я заметил следующие вещи:

  • :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. Вы можете обойти это, создав еще одно окно.

Другой фон

  1. Опции splitright, splitbelow

    может использоваться для управления (в некоторой степени) появлением вновь созданных (разделенных) окон

  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 голос
/ 09 марта 2012

Я протестировал его на Windows-машине с gvim и мог воспроизвести вашу проблему, вот обходной путь, который мне помог, добавив следующие команды к vimrc (я получил с :e $MYVIMRC):

set splitright

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

nmap <C-w>v :call MySplit()<CR>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...