如何評價 vim 8.0?

vim/version8.txt at master · vim/vim · GitHub

更新(2016年9月12日):8.0 已經發布了,剛更新的,大家自己到

http://www.vim.org 上面查看最新信息。


終於發布了 Vim 8.0, 北京時間 2016年9月12日 22:12,Bram 更新了 8.0 的 Announcement:

After more than ten years there is a major Vim release. It gives you interesting new features, such as channels, JSON, Jobs, Timers, Partials, Lambdas, Closures, Packages and more. Test coverage has been increased, many bugs were fixed, this is a rock stable version.

Among the new features are:

- Asynchronous I/O support, channels, JSON

- Jobs

- Timers

- Partials, Lambdas and Closures

- Packages

- New style testing

- Viminfo merged by timestamp

- GTK+ 3 support

- MS-Windows DirectX support

早在今年4月份,上述功能就開發出來了,到在5月份的 7.4.1829時就基本可用了(我也從那時開始使用),其後幾個月陸續修正到 7.4.2367 (共計修正538項缺陷),7.4.2367之後打上 8.0這個 tag,可以說是比較穩定的一個版本。

眾所周知,Vim 可能受 NeoVim 的刺激,加入了非同步任務系統和 Timer,下面再介紹下這幾個主要功能更新以及給 Vim 帶來的影響:

非同步任務

以前在 Vim 裡面調用外部一個程序(比如編譯,更新 tags,Grep ,檢查錯誤,git/svn commit)等,只能傻等著外部程序結束才能返回 Vim ,這也是 Vim 最受 emacs 詬病的地方,限制了很多可能性,導致NeoVim當年發布時,最先引入的新功能就是非同步機制。如今 8.0中,可以在後台啟動各種長時間運行的任務,並把輸出重定向到 VimScript 裡面的某個 callback 函數,和 nodejs的子進程管理模塊類似,使得你可以一邊瀏覽/編輯文件,一遍運行各種長時間編譯類任務可以同時運行,並且把輸出同步到 Vim 里的某個窗口中。

時鐘機制

可以在 VimScript 中創建時鐘,比如每隔100ms調用一下某個 VimScript 裡面的函數,這樣方便你定時檢查各種狀態,比如某項工作是否做完,或者某個與伺服器的通信如何了。有這個機制配合 Python 可以實現純腳本的終端,或者實現網路交互,實時讀取一些股票信息並且顯示在右下角之類的,這給 Vim 插件開發帶來了更多可能性。

網路機制

可以用純 VimScript + socket + json 和外部支持json的伺服器進行通信,比如通知遠程伺服器做一件什麼事情,或者查詢個什麼東西,不過使用 Timer + python 也可以達到同樣的效果。

對 Vim 插件有何影響呢?

總之 Vim 8.0 的這次更新,Vim帶來了更多可能性,讓各種插件能夠完成很多以前做不了的事情,讓 Vim 在保持小巧的情況下,跟 emacs 一樣變得 「像個操作系統了」 (這句話好像是 emacser 們最值得驕傲的地方),提供比以前好得多的體驗,期待馬上有人用 Python + timer 實現一個內嵌終端出來,再移植個 emacs的後台任務管理器之類的,以 Python的強大,外加 Vim 自身機制的提升,實現一個 org-mode之類的東西只是時間問題。

(當然,emacser 們十分迷戀的 org-mode,個人覺得有些過時了,今天這個時代,這類事情還是交給各種能在:手機+PC+WEB+雲上同步的知識管理、日程管理/GTD 的專業軟體去做吧)

除此之外,一些太老的插件比如判斷版本號時沒有考慮到8.0的可能需要稍加修改。

怎麼取得最新的 Vim 8.0 ?

大家如果要試用 vim 8.0的話,可以自己下載代碼編譯:

git clone https://github.com/vim/vim.git

Windows 下面有直接二進位下載:

ftp://ftp.vim.org/pub/vim/pc/gvim80.exe

Windows 下還有每日的自動 daily build:

https://github.com/vim/vim-win32-installer/releases/

Mac 下面使用的話,可以直接 brew 安裝一個最新的vim,原來安裝過的話,brew update一下即可。或者使用最新的 MacVim(整合了7.4.2364),同樣和 8.0幾乎沒區別了。

Vim 7.4.2364 和 Vim 8.0 的區別?

Vim 7.4.2367之後直接打上了 8.0的tag,離 7.4.2364隻有3項小修正:分別修正了一些windows打包腳本的問題,以及測試用例的小問題,沒啥大更新。

怎麼體驗一下 Vim 8.0 的各種新功能?

廣告時間,歡迎使用我開發的第 N個 Vim 插件 asyncrun:

asyncrun - Run Async Shell Commands in Vim 8.0 and Output to Quickfix in Realtime

使用 :AsyncRun 命令可以跟以前!類似的運行各種 shell 命令,只不過是放到後台運行了,同時把這些命令的輸出(stdout+stderr)重定向到當前 quickfix窗口,大家在 Quickfix 窗口裡面可以實時看到後台命令的輸出,以及執行情況(是否結束,退出碼是多少)。

比如:後台非同步運行編譯任務,編譯當前文件或者工程

:AsyncRun gcc % -o %&< :AsyncRun g++ -O3 % -o %&< -lpthread :AsyncRun make :AsyncRun make -f makefile

在 Vim 裡面非同步提交工程,並把提交結果實時顯示在 Quickfix中:

:AsyncRun git push origin master

綁定 F7為非同步編譯當前文件:

:noremap & :AsyncRun gcc % -o %&< &

命令的參數接受下面這些宏(和vim裡面的 expand函數類似):

%:p - File name of current buffer with full path
%:t - File name of current buffer without path
%:p:h - File path of current buffer without file name
%:e - File extension of current buffer
%:t:r - File name of current buffer without path and extension
% - File name relativize to current directory
%:h:. - File path relativize to current directory
& - Current directory
& - Current word under cursor
& - Current file name under cursor

更多詳細信息見項目文檔,如果你還不知道怎麼打開quickfix窗口,請使用命令:

:botright copen 10

即可打開 quickfix窗口,然後 cclose 就可以關閉(可以綁定到快捷鍵F10上)

各位使用的順手的話,請為我投一票:

http://www.vim.org/scripts/script.php?script_id=5431

期待各大 Linux 發行版儘快跟進 vim的新 package,否則只能逼我在伺服器上自己編譯了。

最後,祝各位愉快的使用 Vim 8.0


只要你稍微關注一下 vim 的開發過程你就知道不是說 8.0 突然加了一堆東西。

我在這篇專欄下的評論說過了 Vim 8.0 即將發布! - Vim - 知乎專欄

其實也不是新功能,就是功能加到一定程度然後整體發個新版本,相當於打個 tag。比如 renderoptions 是 patch - 393 加入的,jobs 是 patcc - 1274 (其他沒看)。如果一直在使用最新編譯的版本(自己編譯或者從 Vim 7.4.1751 builds for Windows 之類的 buildbot 下載)的話應該差別不是很大。

現在 7.4 早就到了 7.4.1830,我估計很多人還在用 7.4.6xx 這個版本。

當然,追求新版本也沒有什麼太大意義。我用的是自己編譯的版本(其實是託管在 appveyor),想起來就去下一個。


Vim8.0發布幾天了,今天沒忍住搞了下,把以前寫的配置文件重構了下,因為win_getid系列函數,導致配置文件大幅簡化,效率也因為重構好了很多…

補充幾張圖,以下為現在使用的橫向Tab的一共用了九個插件…

保證界面不亂就是定製快捷鍵來打開各種功能,並添加相關autocmd來觸發運行界面重畫函數. 以下是我關於界面的快捷鍵…

"******************************************************************************

" Keyboard for Fx

"******************************************************************************

map & :call LocateFile()&

map & :call ResetWorkspace()&

map & :call ResetSimple()&

map & :call HandleOpe("unite","open")&

map & :call HandleOpe("quickfix","open")&

map & :call MakeDebug()&

map & :call MakeBrowser("chrome")&

map & :call MakeBrowser("firefox")&

我用的插件和地址列一下:

"******************************************************************************

" Vundle

" VundleVim/Vundle.vim

"******************************************************************************

" NERDtree

" https://github.com/VundleVim/scrooloose/nerdtree

"******************************************************************************

" MiniBufferExplorer

" fholgado/minibufexpl.vim

"******************************************************************************

" Tagbar

" https://github.com/VundleVim/majutsushi/tagbar

"******************************************************************************

" Unite

" https://github.com/VundleVim/Shougo/unite.vim

"******************************************************************************

" Unite-Neomru

" https://github.com/VundleVim/Shougo/neomru.vim

"******************************************************************************

" FencView

" https://github.com/VundleVim/adah1972/fencview

"******************************************************************************

" CssColor

" https://github.com/VundleVim/ap/vim-css-color

"******************************************************************************

" Emmet

" https://github.com/VundleVim/mattn/emmet-vim

"******************************************************************************

" UltiSnips

" https://github.com/VundleVim/SirVer/ultisnips

"******************************************************************************

" Vim-Snippets

" https://github.com/VundleVim/honza/vim-snippets

"******************************************************************************

" MatchTagAlways (Need Python)

" https://github.com/VundleVim/Valloric/MatchTagAlways

"******************************************************************************

" Neocomplete (Need Lua)

" https://github.com/VundleVim/Shougo/neocomplete.vim

"******************************************************************************

" YouCompleteMe (Need Python)

" https://github.com/VundleVim/Valloric/YouCompleteMe

"******************************************************************************

話說當時配色當時差點搞瘋我,最後把配色改成了我要的風格…


這是和 NeoVim 對飆的節奏。早在 14 年 Bram Moolenaar 就表達過對 NeoVim 的一些開發理念和節奏的不認同。對 NeoVim 既要改進插件系統,又要同時重構 Vim 眼裡不爽的各類實現的非理性行為, Bram Moolenaar 不太理解。

4: NeoVim has been under development for roughly eight months. What are your thoughts about it now that it』s gained some traction?

No idea. Some of the basic choices seem odd and irrelevant for the main goals. Such as dropping support for some systems and not being backwards compatible. The goals could just as well been implemented without that.

A lot of it feels like someone who doesn』t like the old code and wants to do it 「right.」 I can agree that the old code is ugly. But it will take an awful lot of effort to make a new implementation. It』s a lot like what happened to Elvis: A rewrite was going to make it much better, but it took so long, during which Vim added more features, that eventually there are not so many Elvis users. And the rewritten Elvis may have nice code, but users don』t notice that.

I do hope that the nice things that NeoVim comes up with can be added back to Vim. I mean, who doesn』t want better plugin support, a better GUI and embedding? The big question is how to do that, and who is going to implement it properly.

有意思的是 Bram Moolenaar 搬出 Elvis 來舉例子,大談 Elvis 嘗試重構卻追不上 Vim 的新特性,最後輸在用戶採納上。言語之中似乎隱含著對 NeoVim 的威脅:你這麼冒進的重構,小心 Vim 升級快了你跟不過來。這不 Vim 8.0 來了,同樣效果的功能,實現思路卻不一樣。如果 NeoVim 選擇堅持自己實現,那麼輕者可能會導致 plugin 的開發成本增加,重者會導致社區分裂。

據說 Emacs 粉已經開始慶祝了。


Async 那一塊兒妥妥是受了nvim影響,不過從題主引用的changelog來看,還是有很大不同。vim提供最最基礎的功能,nvim提供了更多的helper(msgpack等),所以核心理念仍然不一樣,vim依然是個集中式的系統而nvim為了實行分散處理把膠水做得更好用。

剩下好多東西我覺得都是在填坑,新的包管理器不知道如何,但是已有的如vundle,pathogen我感覺已經很好,強過Emacs的中央源(melpa可以類比http://vim.org上那一堆東西,雖然更自動化,但是和GitHub怎麼比嘛)。短期內應該現有的pm都不會跟進。

VimL方面的改進,會讓寫插件更輕鬆,但是短期大家還是不會跟進。。changelog裡面提到的,大家被折磨了這麼多年之後已經總結出了完整的應對措施。

UI的進化太對了!DirectX就是好!編輯器就是要讓字體好看!這可能是普通用戶最能直接受益的方面。有效延長用戶眼球的使用壽命啊。


一直關注,的確版本8上的一些功能有點要和neovim對飈的意思,但是關注的是vim的最主要維持者作者Bram的超強恆心,幾十年如一日的維護,vim的提交甚至比新項目的neovim還更勤奮,小小預言下,neovim最終還干不過vim。vim版本8的一個意義就是和接近完成的neovim比個高低。


相比neovim,我還是更喜歡原版的vim,不過有競爭總是好的,非同步就是我很想要的功能


俺還在用7.4.52,貌似console里的編輯器就vi, emacs, nano幾個,emacs太重,nano功能太弱,就指望vim了:)


對子進程的返回結果處理不夠統一,看郵件列表裡說的,貌似要增加幾個變數:mkprgenc,grepprgenc等類似這樣的。另外好像大家都在用quickfix窗口?

vim的縮略詞一下拉高了門檻,ctrlp插件大量使用這個,看起來好累。


瀉藥,Vim8.0增加了不少新特性,不過對於像我這樣以實用為根本目的的人來說沒什麼必要去深入研習 只要它能滿足我的日常需求就行了。

***********

最讓我興奮的應該就是非同步啦,因為我可以不需要退出當前編輯頁面去運行我的程序

**********

雖然沒寫出什麼建設性的答案,但是既然來都來了,那就貼一下自己的配置吧!

https://github.com/M-Kepler/KeplerVim


這個非同步來得有點晚


edit with vim 菜單終於可用了


推薦閱讀:

為什麼markdown不支持字型大小和字體顏色?
怎麼在自己的網頁上使用MarkDown編輯器呢?
Sublime Text 2 與 TextMate 2 相比有哪些優缺點?
notepad++里的++用英文怎麼發音?
我的文件a.txt,裡面有1萬多行,我想用批處理,每1000行就分別形成一個文本文件並保存到當前文件夾,文件名可為數字序號1.txt,2.txt,3.txt.....該怎麼做?

TAG:文本編輯器 | Vim | 如何看待評價X |