標籤:

vim多人編輯是一種什麼樣的體驗

在使用vim寫論文或編輯文檔時,存在多人編輯同一份文檔的需求(具體的一個應用場景參考我的另一篇文章從零開始配置跨平台多人合作LaTeX論文寫作環境 - 知乎專欄)。當一人編輯完文檔想保存時,vim會自動檢查該文檔有沒有在編輯這段時間內被其他人修改,如果發現被修改了就會顯示如下警告:

此時如果你選"y",你的編輯內容會保存,但你小夥伴的編輯內容會被覆蓋,so你賣了隊友。

而若你選擇"n",你的編輯內容又不會保存下了,so你為隊友犧牲了。

那麼正確姿勢應該是怎樣的呢?老司機掏出google(不要問我為啥不用X度)搜索關鍵詞「vim multiuser」發現reddit上也有人發出同樣的需求和疑問:

I would love to SSH into a server and edit a file in Vim at the same time as a friend.As I"ve understood it, this isn"t possible right now, but would it be possible to make an add-on that makes this possible? Some sort of auto-save that updates every second? Will there be a conflict because of the swap files?The thought of being able to do this makes me warm and fuzzy inside, please don"t disappoint me!

總結一下,通過搜索引擎得到的解決方法大致分為幾類:

1. 用共享屏幕的方法協同編輯:如screen或tmux+vim或者安裝CoVim插件

2. 用版本控制工具如git,svn管理和合併分支

看到這些回答,感覺是殺雞用牛刀了,我們需要的是輕量級的解決方案,越方便越好。

好了,不饒彎子了,直接祭出linux下能夠與beyondcompare媲美的vimdiff工具來解決多人編輯衝突的問題吧。問題的重現和解決過程的如下:

首先在.vimrc中插入下述代碼,關閉vim的swap文件機制,目的是為了當多個用戶打開同一份文檔時不要出現下圖所示的警告。

set noswapfile

新建文件f1

touch f1

在窗口1(模擬你的小夥伴)打開f1

vim f1

同時也在窗口2(模擬你)打開f1

vim f1

在窗口1編輯f1的內容如下:

aaaaaabbbbbbccccccdddddd

在窗口1保存

:w

在窗口2編輯f1的內容如下

aaaaaaccccccdddeeeffffff

在窗口2保存

:w

此時出現編輯衝突,窗口2中顯示下圖所示的警告。至此多人編輯衝突的問題已經成功重現

下面演示如何解決:

在窗口2,按下「n」回車

然後,將窗口2中的編輯內容另存為f2,並退出此次編輯

:w f2:q!

這個時候,告知你的小夥伴,讓他保存下他當前編輯的文檔並退出編輯,等待你處理完衝突。也就是在窗口1中保存並退出

:wq

現在你需要在窗口2中使用vimdiff工具進行文本比較和合併

vimdiff f1 f2

上圖左半邊為f1文件的內容,右半邊為f2文件的內容,按ctrl+w可以在左右兩個子窗口自由切換,窗口中有顏色標記的連續行為不同diff塊(一個diff塊可以是多行)

假如你想將f1文件(即你小夥伴編輯的)的第4行和第5行替換成你編輯的內容的話,可進行如下操作:

在右半窗口讓游標處在第4行,按dp,可看見左半邊窗口完成了我們希望的修改

執行:wqa

done!退出編輯窗口,通知你的小夥伴,衝突已成功解決,可以繼續進行編輯文件f1了


推薦閱讀:

Stack Overflow:幫助一百萬開發者退出 Vim
為什麼很多人認為編輯器比 IDE 更酷?
如何提高右手小拇指打字的靈活性?
linux下終端操作有什麼不好?
真的會有人用 vim 開發大的項目嗎?

TAG:Vim | Linux | LaTeX |