перейти с режима вставки в обычный режим при переходе на другую вкладку? - PullRequest
3 голосов
/ 06 июля 2011

Скажем, у меня есть несколько вкладок с несколькими буферами на разделенных экранах.

Когда я в режиме редактирования в одном буфере и переключаюсь на другую вкладку (ctrl-pageDown), я все еще в режиме вставки.

Есть ли способ автоматического переключения в обычный режим при смене вкладок?

Еще лучше, возможно ли вернуться в режим вставки при возврате в исходный буфер?

Ответы [ 3 ]

7 голосов
/ 06 июля 2011

Вы можете попробовать добавить что-то очень простое, например

autocmd TabEnter * stopinsert

, к вашему .vimrc.

3 голосов
/ 06 июля 2011

В BufLeave вы можете вызвать функцию, которая проверит, в каком режиме вы находитесь, и установить буферную переменную, а затем в BufEnter проверить, существует ли она, и перейти в этот режим.

См. Справку по mode(), b:var.

Вот несколько примеров для .vimrc. Написав его только сейчас для этой цели, я сам начал его использовать и думаю, что это будет полезно.

au BufLeave * call ModeSelectBufLeave()
au BufEnter * call ModeSelectBufEnter()

function! ModeSelectBufLeave()
    let b:mode_select_mode = mode()
    " A more complex addition you could make: if mode() == v, V, <C-V>, s, S, or <C-S>, store the selection and restore it in ModeSelectBufEnter
endfunction

function! ModeSelectBufEnter()
    let l:mode = mode()
    stopinsert  " First, go into normal mode
    if (l:mode == "i" || l:mode == "R" || l:mode == "Rv") && 
    \       (!exists('b:mode_select_mode') ||
    \       b:mode_select_mode == "n" ||
    \       b:mode_select_mode == "v" ||
    \       b:mode_select_mode == "V" ||
    \       b:mode_select_mode == "\<C-V>" ||
    \       b:mode_select_mode == "s" ||
    \       b:mode_select_mode == "S" ||
    \       b:mode_select_mode == "\<C-S>")
        normal l
        " Compensate for the left cursor shift in stopinsert if going from an
        " insert mode to a normal mode
    endif
    if !exists('b:mode_select_mode')
        return
    elseif b:mode_select_mode == "i"
        startinsert
    elseif b:mode_select_mode == "R"
        startreplace
    elseif b:mode_select_mode == "Rv"
        startgreplace
    endif
endfunction
1 голос
/ 06 июля 2011

В моем .vimrc есть следующее:

nmap <C-b> :b#<CR>
imap <C-b> <ESC>:b#<CR>

Это позволяет мне нажимать Ctrl + b в обычном режиме или в режиме вставки, чтобы переключиться на альтернативный буфер, но оставить меня в обычном режиме.

Что касается вашего вопроса, вы можете сделать это:

imap <C-b> <ESC>:bnext<CR>i

Это позволит вам нажать Ctrl + b в режиме вставки и переключиться на следующий буфер, переведя вас в режим вставки, когда вы туда попадете.

Если вы обнаружите, что переключаетесь назад и вперед между одними и теми же двумя буферами, моё оригинальное отображение выше может быть более полезным. Конечно, если вы используете все три, вам понадобится другая комбинация клавиш для последнего.

...