vim - 防止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 跳来跳去吗?
解决方案
问题在于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=''
您将设置一个带有两个单引号的两个字符的字符串。
推荐阅读
- php - 使用 PHP 从 JSON 中检索 videoId
- sharepoint-online - 已部署的 Web 部件在控制台中显示错误,但对于非本地工作台却没有
- eslint - 如何在没有位置参数的情况下调用 eslint
- c# - 从 MethodInfo 创建委托时出错
- emacs - 在 `nlinum-mode` 中突出显示活动缓冲区的当前行号
- r - 拆分字符列并获取字符串中的字段名称
- angular - 从父角度调用函数
- visual-studio-code - VS 代码行和多行
- mongodb - 如何编写 MongoDb Mongoose 查询以匹配两个属性
- pytorch - PyTorch:在这个简单的例子中,为什么损失不变?