--- /dev/null
+from _typeshed import StrOrBytesPath, StrPath
+from collections.abc import Iterator
+from typing import Any, Tuple, Union
+
+from pygments.lexer import Lexer, LexerMeta
+
+_OpenFile = Union[StrOrBytesPath, int] # copy/pasted from builtins.pyi
+
+# TODO: use lower-case tuple once mypy updated
+def get_all_lexers() -> Iterator[tuple[str, Tuple[str, ...], Tuple[str, ...], Tuple[str, ...]]]: ...
+def find_lexer_class(name: str) -> LexerMeta | None: ...
+def find_lexer_class_by_name(_alias: str) -> LexerMeta: ...
+def get_lexer_by_name(_alias: str, **options: Any) -> Lexer: ...
+def load_lexer_from_file(filename: _OpenFile, lexername: str = ..., **options: Any) -> Lexer: ...
+def find_lexer_class_for_filename(_fn: StrPath, code: str | bytes | None = ...) -> LexerMeta | None: ...
+def get_lexer_for_filename(_fn: StrPath, code: str | bytes | None = ..., **options: Any) -> Lexer: ...
+def get_lexer_for_mimetype(_mime: str, **options: Any) -> Lexer: ...
+def guess_lexer_for_filename(_fn: StrPath, _text: str, **options: Any) -> LexerMeta | None: ...
+def guess_lexer(_text: str | bytes, **options: Any) -> Lexer: ...
+
+# Having every lexer class here doesn't seem to be worth it
+def __getattr__(name: str) -> Any: ...