Many editors such as vim and emacs support "modelines", a comment at the beginning of the file that allows the file type to be explicitly specified along with per-file specific settings - The amount of configurations, style and settings mapping cannot be handled in one go, so this opens up a lot of potential improvements. - I left out the possiblity to have "zed" specific modelines for now, but this could be potentially interesting. - Mapping the mode or filetype to zed language names isn't obvious either. We may want to make it configurable. This is my first contribution to zed, be kind. I struggled a bit to find the right place to add those settings. I use a similar approach as done with editorconfig (merge_with_editorconfig). There might be better ways. Closes #4762 Release Notes: - Add basic emacs/vim modeline support. Supersedes #41899, changes: - limit reading to the first and last 1kb - add documentation - more variables handled - add Arc around ModelineSettings to avoid extra cloning - changed the way mode -> language mapping is done, thanks to `modeline_aliases` language config - drop vim ex: support - made "Local Variables:" handling a separate commit, so we can drop it easily - various code style improvements --------- Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
40 lines
2.4 KiB
TOML
40 lines
2.4 KiB
TOML
name = "Python"
|
|
grammar = "python"
|
|
path_suffixes = ["py", "pyi", "mpy"]
|
|
first_line_pattern = '^#!.*((\bpython[0-9.]*\b)|(\buv run\b))'
|
|
modeline_aliases = ["py"]
|
|
line_comments = ["# "]
|
|
autoclose_before = ";:.,=}])>"
|
|
brackets = [
|
|
{ start = "f\"", end = "\"", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "f'", end = "'", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "b\"", end = "\"", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "b'", end = "'", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "u\"", end = "\"", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "u'", end = "'", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "r\"", end = "\"", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "r'", end = "'", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "rb\"", end = "\"", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "rb'", end = "'", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "t\"", end = "\"", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "t'", end = "'", close = true, newline = false, not_in = ["string", "comment"] },
|
|
{ start = "\"\"\"", end = "\"\"\"", close = true, newline = false, not_in = ["string"] },
|
|
{ start = "'''", end = "'''", close = true, newline = false, not_in = ["string"] },
|
|
{ start = "{", end = "}", close = true, newline = true },
|
|
{ start = "[", end = "]", close = true, newline = true },
|
|
{ start = "(", end = ")", close = true, newline = true },
|
|
{ start = "\"", end = "\"", close = true, newline = false, not_in = ["string"] },
|
|
{ start = "'", end = "'", close = true, newline = false, not_in = ["string"] },
|
|
]
|
|
|
|
auto_indent_using_last_non_empty_line = false
|
|
debuggers = ["Debugpy"]
|
|
increase_indent_pattern = "^[^#].*:\\s*(#.*)?$"
|
|
decrease_indent_patterns = [
|
|
{ pattern = "^\\s*elif\\b.*:\\s*(#.*)?", valid_after = ["if", "elif"] },
|
|
{ pattern = "^\\s*else\\b.*:\\s*(#.*)?", valid_after = ["if", "elif", "for", "while", "except"] },
|
|
{ pattern = "^\\s*except\\b.*:\\s*(#.*)?", valid_after = ["try", "except"] },
|
|
{ pattern = "^\\s*finally\\b.*:\\s*(#.*)?", valid_after = ["try", "except", "else"] },
|
|
]
|
|
import_path_strip_regex = "/__init__\\.py$"
|