Предотвратить vim от перехода через исходный код - PullRequest
2 голосов
/ 29 апреля 2020

люди!

Я использую vim в качестве IDE для написания кода в bash, Python и C. Кроме того, у меня есть карта ключей для выполнения моего текущего буфера в зависимости от типа файла. Вот ответственные части моего .vimr c:

...
autocmd FileType python call Python_source()
autocmd FileType sh call Bash_source()
...
" Read lw (lispwords) modelise from current buffer and pass it as command arguments
func! LWargs()
    set lw=''
    doautocmd BufRead
    if len(&lw) > 0 && len(&lw) < 512
        return ' ' . &lw
    endif
    return ''
endfunc

func! Python_source()
    setlocal number cursorline
    setlocal shiftwidth=2
    setlocal foldmethod=indent

    map <F9> :w \| :exe '!python' '%:p' . LWargs()<CR>
    imap <F9> <Esc> :w \| :exe '!python' '%:p' . LWargs()<CR>

    " Comments on Ctrl-C
    map <C-C> :call ToggleComment('#')<CR>
    imap <C-C> <Esc>:call ToggleComment('#')<CR>li
endfunc

func! Bash_source()
    setlocal number cursorline
    setlocal shiftwidth=4

    map <F9> :w \| :!./%<CR>
    imap <F9> <Esc> :w \| :!./%<CR>

    map <C-C> :call ToggleComment('#')<CR>
    imap <C-C> <Esc>:call ToggleComment('#')<CR>li
endfunc
...

Итак, когда я нажимаю F9, случаются маги c, и мой код выполняется с аргументами, переданными LWargs. Единственная проблема заключается в том, что после выхода из программы vim перейдет к началу файла, заставляя меня переместить курсор назад на строку, над которой я работал, и усложнить мою жизнь. Есть ли способ предотвратить прыжок vim?

1 Ответ

3 голосов
/ 29 апреля 2020

Проблема связана с командой doautocmd BufRead в вашем LWargs(), которая сбрасывает позицию курсора в верхнюю часть файла.

(По крайней мере, в моем случае команда использовалась для восстановить позицию курсора при открытии Vim является причиной перемещения курсора. Вы можете просмотреть список из :autocmd BufEnter *, чтобы увидеть, можете ли вы найти аналогичную или другую команду, которая может вызвать перемещение курсора. оказывается, я также получал то же правило из моего Linux дистрибутива ...)

Хороший способ предотвратить это - использовать winsaveview() для сохранения местоположения курсора и вида окна в целом (какая строка вверху, прокручивается ли ваше окно вправо до столбца, когда перенос слов отключен) и winrestview() для его восстановления.

Вот обновленный LWargs(), который не будет двигать вашим курсором:

function! LWargs()
    set lw=
    <b>let saved_view = winsaveview()</b>
    doautocmd BufRead
    <b>call winrestview(saved_view)</b>
    if len(&lw) > 0 && len(&lw) < 512
        return ' ' . &lw
    endif
    return ''
endfunction

Обратите внимание, что правильный синтаксис - set lw=, если вы используете set lw='', вы будете устанавливать двухсимвольная строка с двумя одинарными кавычками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...