众所周知,写作是一项极具挑战性的工作,即使对最优秀的作家来说也是如此。这并非是由于缺乏好的建议——大量关于写作技巧的知识散布在用法指南、词典、技术手册、论文、小册子、网站以及伟大作家和编辑的心中。但是仅仅钻研《Strunk & White》并不能让一个人成为更好的作家——它既不能让你变成Strunk,也不能让你变成White。而且没有人有能力将《Garner's Modern English Usage》这本1100页的用法指南中的所有建议应用到他们所写的每一篇文章中。事实上,认为通过阅读写作建议就能成为更好的作家这一观点,是建立在对学习和记忆的不切实际假设之上的。因此,传统形式的写作知识本质上是惰性的,等待被转化。
我们设计了一个简单的解决方案:proselint
,一个英语散文的检查工具。检查工具是一种计算机程序,类似于拼写检查器,它会扫描文件并检测问题——就像真正的除尘滚筒帮助你去除衣服上不需要的绒毛一样。
proselint
将世界上最伟大的作家和编辑置于你身边,他们会悄悄地给你提供改善散文的建议。你将得到启发自Bryan Garner、David Foster Wallace、Chuck Palahniuk、Steve Pinker、Mary Norris、Mark Twain、Elmore Leonard、George Orwell、Matthew Butterick、William Strunk、Elwyn White、Philip Corbett、Ernest Gowers以及世界顶级文学杂志和报纸编辑团队等人的建议。我们的目标是汇集有关写作最佳实践的知识,并以散文检查工具的形式将这些知识立即提供给所有作者;所有这些都集成在一个简洁的命令行工具中,你可以将其集成到其他工具、脚本和工作流程中。
安装
要启动并运行它,请使用pip进行安装:
pip install proselint
Fedora
sudo dnf install proselint
Debian
sudo apt install python3-proselint
Ubuntu
sudo add-apt-repository universe
sudo apt install python3-proselint
其他软件的插件
proselint
可用于:
- 演示编辑器
- Sublime Text
- Atom Editor(感谢Clay Miller)
- Emacs通过Flycheck或Flymake
- Vim通过ALE或Syntastic(感谢@lcd047、@Carreau和Daniel M. Capella)
- Neovim通过null-ls(null-ls为proselint提供了诊断和代码操作)
- Phabricator的
arc
CLI(感谢Jeff Verkoeyen) - Danger(感谢David Grandinetti和Orta Therox)
- Visual Studio Code(感谢Patryk Peszko)
- coala(感谢coala开发组)
- IntelliJ(由Victor Kropp开发)
- pre-commit(由Andy Airey开发)
- Statick
- MegaLinter
使用方法
假设你有一个文档text.md
,内容如下:
John is very unique.
你可以使用命令行对文档运行proselint
:
proselint text.md
这会将建议列表打印到标准输出,每行一个。每个建议的格式如下:
text.md:<行>:<列>: <检查名称> <消息>
例如,
text.md:0:10: wallace.uncomparables 不可比较词的比较:"unique"不能被比较。
命令行工具还可以使用--json
标志以JSON格式打印建议。在这种情况下,输出会更加丰富:
{
// 输出此建议的检查类型。
check: "wallace.uncomparables",
// 描述建议的消息。
message: "不可比较词的比较:"unique"不能被比较。",
// 给出建议的人或组织。
source: "David Foster Wallace"
// 指向源材料的URL。
source_url: "http://www.telegraph.co.uk/a/9715551"
// 错误开始的行。
line: 0,
// 错误开始的列。
column: 10,
// 错误开始在文本中的索引。
start: 10,
// 错误结束在文本中的索引。
end: 21,
// 从开始到结束的长度
extent: 11,
// 这个问题有多重要?可以是"suggestion"、"warning"或"error"。
severity: "warning",
// 可能的替换。
replacements: [
{
value: "unique"
}
]
}
要在另一个Python程序中运行检查工具,你可以使用proselint.tools
中的lint
函数:
import proselint
suggestions = proselint.tools.lint("This sentence is very unique")
这将返回一个建议列表:
[('weasel_words.very', "每次你倾向于写'very'时,请用'damn'替代;你的编辑会删除它,而写作将会恰到好处。", 0, 17, 17, 22, 5, 'warning', None), ('uncomparables.misc', "不可比较词的比较:'very unique.'是不可比较的。", 0, 17, 17, 29, 12, 'warning', None)]
检查项
你可以通过修改$XDG_CONFIG_HOME/proselint/config.json
来禁用任何检查项。
如果$XDG_CONFIG_HOME
未设置或为空,将使用~/.config/proselint/config.json
。
此外,为了兼容性,如果$XDG_CONFIG_HOME/proselint/config.json
不存在,将检查旧版配置~/.proselintrc
和$XDG_CONFIG_HOME/proselint/config
。
{
"checks": {
"typography.diacritical_marks": false
}
}
ID | 描述 |
---|---|
airlinese.misc | 避免使用航空业的行话 |
annotations.misc | 捕捉文本中留下的注释 |
archaism.misc | 避免使用古老形式 |
cliches.hell | 避免使用常见陈词滥调 |
cliches.misc | 避免使用陈词滥调 |
consistency.spacing | 保持句子间距一致 |
consistency.spelling | 保持拼写一致 |
corporate_speak.misc | 避免使用企业行话 |
cursing.filth | 应避免使用的词语 |
cursing.nfl | 避免使用NFL禁用的词语 |
dates_times.am_pm | 使用正确的时间表示形式 |
dates_times.dates | 日期的时尚格式 |
hedging.misc | 不要模棱两可 |
hyperbole.misc | 不要夸大其词 |
jargon.misc | 避免使用各种行话 |
lgbtq.offensive_terms | 避免使用冒犯性的LGBTQ术语 |
lgbtq.terms | 误用的LGBTQ术语 |
lexical_illusions.misc | 避免词语幻觉 |
links.broken | 只链接到现有网站 |
malapropisms.misc | 避免常见的用词不当 |
misc.apologizing | 保持自信 |
misc.back_formations | 避免不必要的反向构词 |
misc.bureaucratese | 避免官僚用语 |
misc.but | 避免用"But..."开始段落 |
misc.capitalization | 只大写应该大写的内容 |
misc.chatspeak | 避免使用网络用语和其他聊天用语 |
misc.commercialese | 避免使用商业世界的行话 |
misc.currency | 避免冗余的货币符号 |
misc.debased | 避免使用低俗语言 |
misc.false_plurals | 避免错误的复数形式 |
misc.illogic | 避免不合逻辑的表达 |
misc.inferior_superior | 使用"superior to"而不是"than" |
misc.latin | 避免过度使用拉丁短语 |
misc.many_a | "Many a"后接单数 |
misc.metaconcepts | 避免过度使用元概念 |
misc.narcissism | 谈论主题本身,而不是对主题的研究 |
misc.phrasal_adjectives | 短语形容词要用连字符 |
misc.preferred_forms | 各种首选表达形式 |
misc.pretension | 避免自命不凡 |
misc.professions | 正确称呼职业 |
misc.punctuation | 谨慎使用标点符号 |
misc.scare_quotes | 只在需要时使用引号 |
misc.suddenly | 避免使用"suddenly"一词 |
misc.tense_present | 来自"Tense Present"的建议 |
misc.waxed | 诗意化表达 |
misc.whence | 使用"whence" |
mixed_metaphors.misc | 不要混用比喻 |
mondegreens.misc | 避免使用误听词 |
needless_variants.misc | 使用首选形式 |
nonwords.misc | 避免使用非单词 |
oxymorons.misc | 避免使用矛盾修饰法 |
psychology.misc | 避免误用心理学术语 |
redundancy.misc | 避免重复和说两遍 |
redundancy.ras_syndrome | 避免RAS综合征 |
skunked_terms.misc | 避免使用有争议的术语 |
spelling.able_atable | -able与-atable的使用 |
spelling.able_ible | -able与-ible的使用 |
spelling.athletes | 运动员名字的拼写 |
spelling.em_im_en_in | -em与-im和-en与-in的使用 |