首页 > 解决方案 > 防止vim跳转源码

问题描述

伙计们!

我使用 vim 作为 IDE,用 bash、Python 和 C 编写代码。此外,我有一个键映射来根据文件类型执行当前缓冲区。这是我的 .vimrc 的负责部分:

...
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 时,神奇的事情发生了,我的代码使用 LWargs 传递的参数执行。唯一的问题是程序退出后,vim 将跳转到文件的开头,迫使我将光标定位回我正在工作的行,这让我的生活更加艰难。有什么办法可以防止 vim 跳来跳去吗?

标签: vim

解决方案


问题在于doautocmd BufRead您的命令LWargs(),它将光标位置重置到文件的顶部。

(至少在我的情况下,用于在打开 Vim 时恢复光标位置的命令是导致光标移动的命令。您可以检查列表:autocmd BufEnter *以查看是否可以发现类似的命令或另一个可能导致光标移动的命令移动。再看一遍,原来我从我的 Linux 发行版中得到了同样的规则......)

防止这种情况的一个好方法是winsaveview()保存光标位置和一般的窗口视图(哪一行在顶部,当自动换行关闭时您的窗口是否向右滚动到一列)并winrestview()恢复它。

这是一个LWargs()不会移动光标的更新:

功能!LWargs()
    设置 lw=
    让 saved_view = winsaveview()
    doautocmd BufRead
    调用 winrestview(saved_view)
    如果 len(&lw) > 0 && len(&lw) < 512
        返回 '​​ ' 。&lw
    万一
    返回 '​​'
结束功能

另请注意,正确的语法是set lw=,如果您使用,set lw=''您将设置一个带有两个单引号的两个字符的字符串。


推荐阅读