文本编辑器 BBEdit 为各种类别的源代码提供了语法着色选项,包括纯文本、注释、字符串、语言关键字等。其中一个类别是“预定义符号”,在 BBEdit 文档中定义为
预定义符号不是语言关键字的术语,而是由语言的参考实现预定义的,或者是语言的标准库/框架支持的一部分,或者对使用该语言编写代码的开发人员具有其他特殊含义。
当我在 BBEdit 中编辑 Python 文件时,我发现哪些符号会以这种样式着色是不可预测的。例如,内置常量NotImplemented
或Ellipsis
不会被着色为预定义符号,而像index
或这样的词count
,据我所知,在 Python 中没有固有的特殊含义,却会被着色。
BBEdit 如何决定以这种风格突出显示哪些符号?这可以在某处查看吗?更好的是,可以编辑吗?
答案1
Python 语言模型在 中定义。我将文档的和部分/Applications/BBEdit.app/Contents/PlugIns/Language Modules/Python.bblm/Contents/Info.plist
中的符号与 Python 保留关键字和内置命令列表进行了比较。BBLMKeywordList
BBLMPredefinedNamesList
语法着色列表中未出现几个 Python 关键字/内置函数,包括async
、、、、和一些await
更晦涩难懂的内容。我认为这些都是 Python3 功能,我知道直到 v3.7 才将它们添加为保留关键字,因此 BBEdit 的 Python 语法着色可能已经有一段时间没有更新以反映新的标记了。__debug__
Ellipsis
NotImplemented
async
await
但让我更感兴趣的是,还有大约一百件物品,做出现在语法颜色列表中,但不是Python 关键字或内置命令:
- 比较和成员方法:
__cmp__
,,,,,,,,__contains__
__eq__
__ge__
__gt__
__le__
__lt__
__ne__
- 迭代器方法
__iter__
:__next__
- 序列方法:
count
,index
(但不是可变序列方法,例如,,extend
... )reverse
insert
- 字符串方法:
capitalize
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(但不包括,,casefold
或方法)center
count
encode
endswith
expandtabs
find
format
format_map
index
isalnum
isalpha
isascii
isdecimal
isdigit
isidentifier
islower
isnumeric
isprintable
isspace
istitle
isupper
join
ljust
lower
lstrip
maketrans
partition
replace
rfind
rindex
rjust
rpartition
rsplit
rstrip
split
splitlines
startswith
strip
swapcase
title
translate
upper
zfill
bytes
bytesarray
memoryview
- 设置方法:
add
,,,,,,,,,,,,,,,,clear
copy
difference
difference_update
discard
intersection
intersection_update
isdisjoint
issubset
issuperset
pop
remove
symmetric_difference
symmetric_difference_update
union
- 字典方法:
copy
,,,,,,,,,fromkeys
get
items
keys
popitem
setdefault
update
values
- 上下文管理器方法
__enter__
:__exit__
- 数字模块和类型:
Complex
,decimal
,Decimal
,Fraction
,fractions
,Integral
,Number
,numbers
,(但不Rational
包括,或)Real
cmath
random
statistics
- 模块和类属性:
__bases__
,,,,,,__class__
__dict__
__mro__
__qualname__
__subclasses__
- 常用约定:(
self
但不是cls
)
这些 token 中的绝大多数都是在内置类型Python 文档页面——但如上所述,还有许多其他类似的方法不是包括(例如MutableSequences
或二进制序列,例如bytes
)。我不知道选择所包含的特定标记的逻辑。
有一个 README 文件位于,/Users/[username]/Library/Application Support/BBEdit/Read Me.txt
其中描述了如何向 BBEdit 添加自定义语言模型,其中包括一条注释
**注意**:不要打开 BBEdit 应用程序包来提取或修改其中的语言模块。那样会很疯狂。
但是,尽管这个警告可能是合理的,我仍然想删除所有这些不是关键字或语言内置函数的额外标记,以免它们被语法着色,所以我想我即将发现多少疯狂就是这样的……