.php
看了一圈,都是編程人員在回答,我就做爲一個非編程人員來講點不一樣的視點吧。html
既然說的是「文本編輯器」,最重要的固然是「編輯文本」,而不侷限於編程。前端
我一直在使用的文本編輯器是 vim(windows 下用 gvim,OS X 下用 MacVim),偶爾寫代碼,主要用來作文本處理。Sublime Text、Emacs(包括純 evil mode 和 spacemacs)、Atom、VS Code、em editor、notepad++ 等等都用過,最後仍是回到 vim 。vue
究其緣由,不少文本編輯器是針對編程來優化的,而不是「文本處理」,因而在文本處理上,遠沒有 vim 來得方便。python
我用 vim 主要作的事情有這幾件:react
做爲 markdown 編輯器寫文章linux
vim 用來寫文章的一個很大的優點就是 VOoM 插件。這是一個大綱列表,能夠根據特定的標記符號生成像左邊這樣的文章大綱窗口。在 em editor 中你也能夠找到相似的功能。這個插件默認是支持 markdown 的,可以識別出文章的標題。c++
#一級標題 ##二級標題 ###三級標題 ####四級標題 #####五級標題 ######六級標題 #一級標題 ##二級標題 ###三級標題
而且可以在大綱窗口中經過 ctrl + ↑、ctrl + ↓ 這樣的快捷鍵操做,對標題(及下面所屬的內容)進行上下移動,也能進行升級。對於寫文章時列大綱、把握文章總體構造還有調整文章結構來講都是十分有利的功能。Emacs 的 org-mode 自己的功能雖然十分出色,可是惟獨缺乏這樣方便的大綱功能,仍是比較遺憾的。網上有一些經過 Emacs 的 mini buffer 來實現相似功能的建議,可是對於不熟悉 elisp 的非程序員來講,要本身來實現一個確實太困難了。git
特定的格式化文本處理程序員
得益於 vim 的 ex mode 和 viml( vim language ),我能夠簡單地編寫一些腳本命令來進行重複的文本格式化處理。
好比說,我須要處以下的列表式文本,把左右列分開:
原做 - 川原礫(電撃文庫 / アスキー·メディアワークス刊)
原做イラスト·キャラクターデザイン原案 - abec
監督 - 伊藤智彥
キャラクターデザイン - 足立慎吾
美術監督 - 竹田悠介
色彩設計 - 中島和子
コンセプトアート - 堀壯太郎
撮影監督 - 廣岡嶽
CG監督 - 雲藤隆太
編集 - 西山茂
音響監督 - 巖浪美和
音楽 - 梶浦由記
アニメーション製做 - A-1 Pictures
原做
原做イラスト·キャラクターデザイン原案
監督
キャラクターデザイン
美術監督
色彩設計
コンセプトアート
撮影監督
CG監督
編集
音響監督
音楽
アニメーション製做
川原礫(電撃文庫 / アスキー·メディアワークス刊)
abec
伊藤智彥
足立慎吾
竹田悠介
中島和子
堀壯太郎
廣岡嶽
雲藤隆太
西山茂
巖浪美和
梶浦由記
A-1 Picture
:%s/ - /\r\t :g/^\t/m$
由於我須要頻繁用到這樣的需求,因此不想頻繁重複地寫這樣的命令。因此我就能夠寫一個函數來處理:
function ListSplit() :%s/ - /\r\t :g/^\t/m$ endfunction
咱們能夠看到,這個所謂的函數,實際上就是隻是把 ex mode 中輸入的命令寫上去而已。我日常是怎麼在 vim 的進行操做的,就能夠怎樣很直覺地把這些操做整合成一個函數。對於沒有編程基礎的用戶來講,這比起 elisp 這種過度強大的的語言來講簡單明瞭得多。
在 Emacs 中,你是沒法如此簡單地把通常的操做轉化爲一個函數、一個腳本的。而在其餘編輯器中,你甚至沒法找到一個如此輕量化的解決方案。
完成定義以後,我就能用簡單的調用函數來執行這兩句命令:
:call ListSplit()
若是這樣還以爲麻煩,那麼能夠爲函數定一個自定義命令,省去寫「 call 」的麻煩。
command! ListSplit call ListSplit()
若是連命令都懶得輸,綁定一個快捷鍵也十分簡單:
nmap <F1> :call ListSplit()<cr>
這樣就能夠用 F1(固然也能夠是其餘快捷鍵,配合 鍵甚至能夠有更靈活的配置)調用這個函數。
製做 epub 電子書
製做一本簡單的 epub 電子書,有兩大部分工做:整理文本,和對文本進行打包。
整理文本是 vim 的拿手好戲,而把文本打包成 epub 文件,就涉及到了不少的 I/O 操做,viml 確實是搞不定的,這部分我用了 python 來寫,由於 vim 自己有 python 接口。
這是我用來製做 epub 的小插件:dotvim/bundle/epub-build/plugin at master · zecy/dotvim · GitHub
說是插件,實際上裏面只有一堆相互獨立的函數,而函數的內部基本上都是大量的替換命令。若是是其餘編輯器,你要自行製做一樣的文本整理功能,就逃不了正兒八經的編程了。相對而言,用 viml 來作這個事情,遠遠要簡單得多。
如下我說明裏面的兩個小函數。
function SymbolChange() silent %s/\v(1|2|3|4|5|6|7|8|9|0)/\={'1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9','0':'0'}[submatch(0)]/ge silent %s/\v(A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z)/\={'A':'A','B':'B','C':'C','D':'D','E':'E','F':'F','G':'G','H':'H','I':'I','J':'J','K':'K','L':'L','M':'M','N':'N','O':'O','P':'P','Q':'Q','R':'R','S':'S','T':'T','U':'U','V':'V','W':'W','X':'X','Y':'Y','Z':'Z'}[submatch(0)]/ge python << EOF # -*- coding: UTF-8 -*- import vim import string import re b = vim.current.buffer t = u'\n'.encode("UTF-8").join(b) t = t.decode("UTF-8") def symbolchange(t): t = re.sub(u'( |\t| )+', u' ', t) t = re.sub(u'[\[「【]', u'「', t) t = re.sub(u'[\]」】]', u'」', t) t = re.sub(u'‘', u"『", t) t = re.sub(u'’', u"』", t) # t = re.sub(u'[‘’]', u"'", t) t = string.replace(t, "&", "&") t = re.sub(