.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(