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

时间:2014-12-01 14:21:03

标签: vim

我在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

2 个答案:

答案 0 :(得分:1)

我的建议是使用Vim内置的加密功能。使用:X设置密钥。您可以在此时使用与通常相同的读写文件。有关详细信息,请参阅:h encryption

回答有关如何保存和恢复光标位置的问题:

  • 使用winsaveview()保存视图信息。例如let view = winsaveview()
  • 移动光标
  • 恢复视图状态。例如call winrestview(view)

正如您所说,您发现someone who bundled up autocmd已成为某些功能。您可以通过将视图状态保存到缓冲区变量中来修改它以使用winsaveview() / winrestview()函数。例如let b:view = winsaveview()call winrestview(b:view)

答案 1 :(得分:0)

atweiden 提供的另一个版本包括在写入之前和之后存储和恢复光标。

来自Github的代码:

  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