很久以前就想過要寫一篇關於文字編輯(text editing)的文章,當然我要講的不是要怎麼寫文章,而是關於使用文字編輯器(text editor)的技術。
文字編輯可以說是電腦歷史上最古老也最被廣泛使用的功能之一,無論是古老的mainframe或是現代的PC、Mac,甚至是手機,上面一定都有文字編輯的功能。人們每天都在用文字編輯器,不管是寫blog、打報告、寫程式,即使只是用twitter或plurk寫一句話,也都是在做文字編輯。既然這件事每個人每天都在用,還有什麼好談的呢?有趣的地方就在於,雖然大家每天都在用文字編輯器,但很少人會仔細去想要如何才能把這件事做得更快更好。怎樣的編輯器才是一個好用的編輯器?怎樣的編輯器用起來才能讓人感到行雲流水、人機合一的美妙境界?
我們先從一般最常見的編輯器說起。一個常見的編輯器就像Windows的記事本一樣,或是瀏覽器內預設的文字輸入區(textarea),支援游標移動/選取、新增/刪除/修改文字、複製/剪下/貼上、搜尋/取代等基本功能。這種常見的編輯器用起來很簡單,只要在鍵盤上打字就能新增文字,按下backspace或delete鍵就能刪除文字;用滑鼠點擊任何文章內的地方游標就會移動過去;複製、搜尋等功能可以透過menu bar找到,或是利用一些約定俗成的快速鍵(Ctrl-C, Ctrl-V..)就可以在編輯文章中快速呼叫這些功能。這種編輯器的特色是學習門檻很低,要記憶的只有一些特殊的快速鍵,即使不記得也能透過menu bar或是context menu找到。
如果用之前說過的usability來分析這種編輯器,大概可以知道這樣子的UI具有容易學習(高learnability)、不容易忘記(高memorability)、不容易產生Errors、一般用起來也不會有太大不滿(satisfaction)。一切看起來都很美好,唯一的問題是,這種編輯器的efficiency到底是好還是不好?
回答這個問題前,先繼續看另一種編輯器的設計,我們才能比較不同設計的好壞。
在1976年UNIX剛誕生不久時,出現了一個特殊的編輯器叫做vi。vi引入了一個很特殊的概念:模式(mode)。
vi和一般常見編輯器最大的不同在於它有兩種模式,命令模式(command mode)和插入模式(insert mode)。在命令模式下任何鍵盤輸入都會被解讀成送給編輯器的特殊指令,例如移動游標、複製/貼上、搜尋..等等全都是送給編輯器的命令。而在插入模式下,鍵盤輸入的字會被送入編輯中的文件內,這模式也就是一般編輯器預設的模式。
在HCI的研究中,模式(mode) 是一個很常被探討的概念。在不同的模式下,使用者即使給了相同的輸入,但系統卻會產生不同結果。日常生活中最常見的例子就是汽車的排檔:在D檔時踩油門車子會前進,但在R檔時踩油門車子卻會後退。而有多種模式的UI會帶來最大的問題是mode error,也就是使用者分不清或是忘記現在系統所在的模式,而得到了非預期的結果。這種error問題可大可小,最嚴重可能就是開車時忘記在R檔而踩了油門想往前進卻撞上後面的車。也有些比較輕微的,像是在打字時忘記caps lock是開著的而不小心打出一連串的大寫文字就比較無所謂,因為看到後馬上就能回頭修正。
但如果是在看不到的時候意外開著caps lock打字呢?(像是打密碼的時候)還好最近幾年出現下面這種設計,在密碼輸入框上面顯示caps lock的狀態,用來避免打密碼時不小心開了caps lock造成的mode error。
vi引入mode到編輯器中,最大的問題就是產生了mode error的可能。也就是說,使用者如果以為他在insert mode而快樂的開始打字,但結果卻是什麼事都沒發生(除非他剛好按到a或i進入了insert mode..)。這問題也是造成vi難以入門的原因:你可以想像有許多第一次進到vi的人,打半天字卻什麼都沒有跑出來會帶來多大的挫折感。而且mode error可怕的地方在於,不是只有新手會碰上這種error,即使是vi的專家也常常會在insert mode打指令或是在command mode中打文章。(如果你在文章中看到:wq這種怪東西,就知道那人是用vi的了)
說起來mode帶來不少壞處,但它也不是沒有好處。讓我們反觀一般編輯器的”mode”設計。常見編輯器其實不是沒有mode,而是他們的mode是「暫時」的(這叫spring-loaded mode),靠Ctrl、Shift、Alt、Cmd、Win這些功能鍵來「暫時」進入命令模式。例如說Ctrl-C可以複製文字,這其實就是靠Ctrl賦予”C”這個鍵暫時的特殊功能,而取消原本在文件裡插入”C”的預設功能。用spring-loaded mode的好處是不容易產生mode error,因為使用者平常就只處在一種mode中,只有當使用者想要用特殊功能時,才必須先刻意按住某些特殊功能鍵來啟動它。spring-loaded mode的壞處在於,Ctrl、Alt、Shift這些鍵的位置在鍵盤的邊緣,再加上還必須按住不放(有時候還要兩三個鍵一起按住),使用者常常就得用彆扭姿勢讓小指和無名指按住,造成精神與肉體上的折磨。在按住這些功能鍵的同時,快速鍵的位置還不能距離太遠才能用單手按到,所以我們才會看到最常用的快速鍵都集中鍵盤左下角(Z undo、A全選、X剪下、C複製、V貼上、F搜尋…)。
後來文字編輯器變得越來越複雜,快速鍵也大量增加,這時在有限的空間內分配快速鍵的位置並且讓使用者容易學習又不容易忘記就成了一件困難的事。現代的一般編輯器,包括很多寫程式用的IDE,大量使用各種混合Ctrl、Shift、Alt的快速鍵,這種快速鍵設計哲學是把每一個功能對應到一組複合鍵上。理所當然的,功能越多,快速鍵就越多越難記。
因為多了mode,vi和一般編輯器的命令設計哲學也非常不同。vi的哲學是把功能分解成最小單元,再把這些最小單元一一對應到不同按鍵上,最後再利用一連串的按鍵組合產生使用者想要的複雜功能。以移動游標來說,vi把這件事分得非常仔細,從字元(character)、單字(word)、行(line)、句子(sentence)、段落(paragraph)、螢幕(screen)、區塊(block)、到檔案(file)都有對應的鍵可以以不同的單位大小來移動游標,例如按w可以跳到下一個單字(word),}可以跳到下一個paragraph…等等。乍看之下似乎很複雜,連移動游標看起來都這麼麻煩,但這樣設計的好處在後面。文字編輯還有很多動作可以做,像是刪除、剪下、複製..等等。vi把動作和操作的單位分解開來,例如:刪除(delete)是d、複製(yank)是y,這樣我們就只需要分別記憶動作對應的鍵和單位對應的鍵,就可以交叉組合出多種一般編輯器做不到的複雜功能。例如說,dw就是刪除(delete)一個單字(word)的意思,y}可以複製(yank)一個段落(paragraph)。如果你想要的話,單位前面還可以加上量詞,例如說d2w是刪除2個單字。
vi的這種設計避免了快速鍵的組合爆炸(想想看如果把各種組合都對應到一個ctrl-alt快速鍵會有多少個..),並且讓使用者能完全使用鍵盤來精確、快速的編輯一個文件,一旦熟悉這種操作後,手都不用離開鍵盤,不管是寫程式或是寫文章都有了一種人機合一的流暢感,心中想到哪裡游標就能精確移動到哪裡,不管多複雜的文字操作都能快速解決,心中的爽快感其實是難以用筆墨形容的。一般編輯器依賴於滑鼠作為移動和選取的主要工具,其實不管在learnability、memorability、errors都優於vi的鍵盤設計,但最大缺點就是efficiency很低。原因之一是,要用滑鼠一隻手就得離開鍵盤,光是這個時間用鍵盤操作的人都已經做完了(用laptop的touch pad就是另一回事了);原因之二是,滑鼠移動是不精確的,要把游標對準某一點所花的時間遠比按下鍵盤上固定位置的按鍵來得長(請參閱之前關於Fitt’s Law的文章);原因之三是,即使是用鍵盤控制游標,也沒辦法針對不同單位大小做控制,所以常常會看到一般使用者按住方向鍵等游標慢慢移動到某個地方..。(註:一般文字編輯器有個小技巧,這裡順便告訴大家:Windows上按Ctrl+左/右可以以一個word為單位移動,Mac上是Alt+左/右。幾乎所有可以打字的地方都能用。)
身為一個靠打字(不管是寫程式或是寫論文)吃飯的人,文字編輯可以說是我在電腦上花最多時間的工作之一。我很幸運在國中就接觸到Linux,所以也就接觸到了vim(vi後來的延伸版,是目前最流行的vi版本),沒想到這一用就用了十年…。vim也是我從國中開始用的每一台電腦裡都必裝的軟體,即使學了數十種程式語言,從Windows、Linux換到Mac,我到現在都還是用vim寫程式、寫論文、寫報告..。甚至在command line (bash)下面,都可以設定成vi mode,接著就能用vi的快速鍵來編輯指令。寫程式如果沒有vim,我等於被打斷一條腿一樣(不誇張,每次被迫在IDE裡寫程式我都有種武功被廢了的感覺…)。雖然一開始學vi/vim的門檻較高,但我很高興一開始花了點時間去學它,後來就再也不用學新的editor或IDE,只靠這一招半式就能行遍天下,實在非常值得呀。
Pingback: Tweets that mention [HCI] 淺談模式(mode)與文字編輯的技術與學習 | vgod’s blog -- Topsy.com
vim 事實上有 11 個 mode 而不是兩個 mode 而已
:help vim-mode
的確, vim大大擴充了vi增加了許多種mode(其實最大的改變也只有visual mode)。但為了怕嚇到讀者,我覺得只要介紹最原始vi的兩種mode就行了。 🙂
淚推。
只要一過了學習門檻,就連 BBS 打完文章也會不小心 :wq
話說 bs2.to 的 bbs 就可以用 vim 了 :p
Vi的設計很老實的是歷史因素比較大,而那個歷史因素叫硬體和OS
Vi的模式是為了用盡鍵盤的所有鍵-而早期的鍵盤配置沒現在這麼統一,所以在可用鍵更少的情形下vi才會有這麼複雜的hotkey系統…(不同mode的話就有多幾套keyboard了)
而且為了減少輸入才有range+組合command這種惡魔
(應該為了配合早期的終端機系統…而且很可能是因為沒有POSIX才避免使用組合鍵以免撞OS hotkey)
因為是早期系統,什麼都只能靠keyboard做,於是vi其實是沒把mouse操作考慮在內 (倒是vim應該是發現keyboard+mouse的操作很慢才會一直以keyboard為主)
因為重重限制於是造就強大但複雜的文字編輯器,Learning Curve超高之餘也難以master…….
雖然 vi 的設計,很多歷史因素。
限定在少數按鍵組合,也使得 vi 變得通用。
word star 也算是一個典型,
早期的 borland IDE 都是參考 ws 的習慣,
ws 相較 vi 多了一些 control-shift,
在一些 terminal 或許會強碰。:o
Pingback: 給程式設計師的Vim入門圖解說明 | vgod’s blog
以下所說的,都是針對 “純種” 的 vi,不是 vim。
vi 的設計老實的原因,是因為當時的連線的條件差。
試問一下,從 DOS 時代到現在的 text editors 中,有幾個 text editor 具備 recovery 功能。但 vi 在老早以前就設計了 recovery 的功能,這正是 vi 為了要在惡劣的連線條件下,降低使用者傳送資料 lost 的一種設計。
就是因為連線的條件很差,所以要儘可能的讓使用者可以快速的送出他們敲出的資料命令,才會有 mode 及 range + command 的設計,跟硬體與 OS 並沒有太大的關係。
再者 vi 並不難學 (至少我教過的人都這麼認為),而且非常的有效率,learning curve 也並不高 (這是對那些很少用 text editor 的人而言)。可惜的是,目前看到的 vi 教材,有很多都是為了表現 “作者很厲害”,而不是讓人來學習的。
說到 vi 的模式切換,就不禁讓我想到這則漫畫 😀
http://tnerual.eriogerg.free.fr/0xBABAF000L/10_en.html
話說回來,雖然工具怪,可是用上手了還真的是離不開他呢,
也在這邊順便感謝你做的 vim 入門圖解,相當實用!
這則漫畫真是很有趣 🙂
抱歉,之前转载您的文章忽略了版权问题,我是一名大陆的学生,您的文章给了我很多启发,希望有机会的话能多多交流
同样是大陆学生,正在刻苦学习vim呢,希望将来达到指随意动的境界。
>>心中的爽快感其實是難以用筆墨形容的
我似乎能體會妳說的
但是你覺得從 25 跳到 45行
操作很麻煩嗎?
我目前覺得不順利的地方
Pingback: VIM教程与学习资料汇总(2010-02-19更新) | 善用佳软
Pingback: VIM教程与学习资料汇总 | 追随我心
Pingback: VIM教程与学习资料汇总 | Goto-Linux
Pingback: Vim学习计划 - Teddy's
寫論文用VI寫 ? 我沒看錯吧 大哥
哈這年頭在下都用 Vi 寫 Blog,然後也有社群大大在用 Vi 簡報啊!!
Pingback: VIM教程与学习资料汇总 — By 善用佳软 | Hello, Linux!
Pingback: 2500 Wiki Backlinks
Pingback: Vim相关资料大全 | 天天三国杀
Pingback: GVIM使用教程大全以及配置和资料汇总 | 哥特复兴