如何在vim中进行“版本控制”?

时间:2011-12-09 08:28:31

标签: vim version-control

例如,我有一个工作代码,但速度不够快,所以我想记录这个版本的代码,然后继续优化它,并且可能有更好的版本,然后再次记录这个版本,等等。 / p>

如果我最终无法获得快速代码,我想回滚到原始的工作代码。

我想这可以通过使用undo分支来实现,但我没有找到如何做到这一点。

5 个答案:

答案 0 :(得分:7)

使用版本控制系统。我建议Git + Fugitive

认真!

你不会回头。

答案 1 :(得分:6)

是的,您可以添加撤消分支功能,使其更像版本控制系统。

在vim 7.3中,您可以进行持久撤消,如here所述,您只需将以下行添加到.vimrc

set undodir=~/.vim/undodir
set undofile

为了充分利用撤消分支,我强烈推荐gundo,因为您可以使用它来可视化树并查看提交的差异。

答案 2 :(得分:2)

有vim的插件。

同时检查:http://www.vim.org/scripts/script.php?script_id=90

答案 3 :(得分:2)

使用版本控制系统绝对是您工作的任何项目的好主意,即使它们相当小。即便如此,HaskellElephant也提出了一个很好的观点 - 偶尔,您可能会尝试使用想要调整的小型一次性脚本。在这种情况下能够创建保存点实际上可能非常酷,所以我玩了vim的undotree()函数并想出了这个脚本:

command! -nargs=1 StoreUndo call s:StoreUndo(<f-args>)
function! s:StoreUndo(label)
  if !exists('b:stored_undo_state')
    let b:stored_undo_state = {}
  endif

  let b:stored_undo_state[a:label] = undotree()['seq_cur']
endfunction

command! -nargs=1 -complete=custom,s:CompleteUndoStates RestoreUndo call s:RestoreUndo(<f-args>)
function! s:RestoreUndo(label)
  if !exists('b:stored_undo_state')
    let b:stored_undo_state = {}
  endif

  if !has_key(b:stored_undo_state, a:label)
    echoerr a:label.' not found in stored undo states.'
  endif

  exe 'undo '.b:stored_undo_state[a:label]
endfunction

function! s:CompleteUndoStates(A, L, P)
  if !exists('b:stored_undo_state')
    let b:stored_undo_state = {}
  endif

  return join(keys(b:stored_undo_state), "\n")
endfunction

这里是gist形式:https://gist.github.com/1473170

例如,您可以将其置于~/.vim/plugin下。执行命令:StoreUndo foo将创建名为“foo”的保存点。你可以做任何你喜欢的改变。执行:RestoreUndo foo时,缓冲区将恢复已保存的状态。 RestoreUndo命令已完成选项卡,包含所有现有保存点。

这不会保留在文件中。如果关闭缓冲区,则会丢失历史记录,因此这只能暂时用于快速实验。

答案 4 :(得分:0)

我不是vim的专家(事实上,我几乎无法使用它),但我想到的解决方案是:

  • 使用实际的版本控制,这就是它的用途。也许甚至其中一个“分布式”口味,因为它们不需要单独的存储库;
  • 只需制作文件/文件夹的备份副本即可。
  • 您甚至可以编写一个简短的程序(shell脚本?),为您复制文件/文件夹,并附加一个后缀,标记您复制的时间。
  • ...然后将该程序绑定到vim shortcurt(不知道如何做到这一点,但传言vim是如此强大,以至于我会想象它有这样的功能)。