Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 使用外部命令将缓冲区写入磁盘后保持光标位置_Vim - Fatal编程技术网

Vim 使用外部命令将缓冲区写入磁盘后保持光标位置

Vim 使用外部命令将缓冲区写入磁盘后保持光标位置,vim,Vim,我在vimrc中使用了一小段vimscript代码,以便在执行:write时能够自动将文本加密到磁盘。不幸的是,每次我保存文件时,光标都会重置到第一行的开头,迫使我向下滚动到原来的位置。挺烦人的 在我将文件写入磁盘后,是否有方法恢复光标位置?完整的代码可以在下面找到 # code from http://vim.wikia.com/wiki/Encryption#ccrypt augroup CPT au! au BufReadPre *.cpt set bin au BufRead

我在vimrc中使用了一小段vimscript代码,以便在执行
:write
时能够自动将文本加密到磁盘。不幸的是,每次我保存文件时,光标都会重置到第一行的开头,迫使我向下滚动到原来的位置。挺烦人的

在我将文件写入磁盘后,是否有方法恢复光标位置?完整的代码可以在下面找到

# code from http://vim.wikia.com/wiki/Encryption#ccrypt
augroup CPT
  au!
  au BufReadPre *.cpt set bin
  au BufReadPre *.cpt set viminfo=
  au BufReadPre *.cpt set noswapfile
  au BufReadPost *.cpt let $vimpass = inputsecret("Password: ")
  au BufReadPost *.cpt silent '[,']!ccrypt -cb -E vimpass
  au BufReadPost *.cpt set nobin
  au BufWritePre *.cpt set bin
  au BufWritePre *.cpt '[,']!ccrypt -e -E vimpass
  au BufWritePost *.cpt u
  au BufWritePost *.cpt set nobin
augroup END

我的建议是使用Vim的内置加密。使用
:X
设置键。此时,您可以像平常一样使用读写文件。有关更多详细信息,请参见
:h加密

要回答有关如何保存和恢复光标位置的问题,请执行以下操作:

  • 使用
    winsaveview()
    保存视图信息。e、 g.
    let view=winsaveview()
  • 移动光标
  • 恢复视图状态。e、 g.
    调用winrestview(视图)

正如您所注意到的,您发现autocmd的一些功能。通过将视图状态保存到缓冲区变量中,您可能可以修改它以使用
winsaveview()
/
winrestview()
函数。e、 g.
让b:view=winsaveview()
调用winrestview(b:view)
atweiden提供的另一个版本包括在写入之前和之后简单地存储和恢复光标

代码来源:


在augroup的开头创建一个标记,然后移动到末尾的该标记?示例:请参阅公告列表:您正在查找
winsaveview()
/
winrestview()
。最好将您的命令捆绑到一个函数中,以利用这些命令。然而,我担心使用这种方法会导致一些泄漏,例如未加密的撤消文件。请参见
:h加密
。使用Vim的本机加密是不可能的吗?如果你把你的评论捆绑在一个答案中,就有可能对它们进行投票:)@Duikboot不确定把这些标记放在哪里,因为我真的根本不读vimscript。在我看来,这些设置是针对特定文件类型在写入、读取等时触发的。为了能够添加标记,我需要将命令捆绑到函数中,对吗?@PeterRincker找到了一个捆绑函数的人:我想我可以很容易地使用它,但是你关于内置加密的提示要好得多。不知道为什么我在谷歌上搜索时从未发现:)
  func! s:ccrypt_bufwritepre()
        let b:save_cursor = getpos(".")
        setl bin
        %!ccrypt -e -E crypticnonsense
    endfunc

    func! s:ccrypt_bufwritepost()
        u
        setl nobin
        call setpos('.', b:save_cursor)
    endfunc