コード例 #1
0
def initial(nvim: Nvim, specs: Sequence[RpcSpec]) -> Settings:
    artifacts: Artifact = decode(Artifact, safe_load(ARTIFACT.read_bytes()))

    user_config = nvim.vars.get(SETTINGS_VAR, {})
    config: _UserConfig = decode(
        _UserConfig,
        merge(safe_load(CONFIG_YML.read_bytes()),
              hydrate(user_config),
              replace=True),
    )
    options, view, theme = config.options, config.view, config.theme

    icons, hl_context = load_theme(
        nvim,
        artifact=artifacts,
        particular_mappings=theme.highlights,
        discrete_colours=theme.discrete_colour_map,
        icon_set=theme.icon_glyph_set,
        icon_colour_set=theme.icon_colour_set,
        text_colour_set=theme.text_colour_set,
    )

    view_opts = ViewOptions(
        hl_context=hl_context,
        icons=icons,
        sort_by=view.sort_by,
        use_icons=theme.icon_glyph_set is not IconGlyphSetEnum.ascii,
        time_fmt=view.time_format,
    )

    keymap = {f"CHAD{k}": v for k, v in config.keymap.items()}
    legal_keys = {name for name, _ in specs}
    extra_keys = keymap.keys() - legal_keys

    if extra_keys:
        raise DecodeError(
            path=(_UserOptions, _key_sort(legal_keys)),
            actual=None,
            missing_keys=(),
            extra_keys=_key_sort(extra_keys),
        )

    settings = Settings(
        follow=options.follow,
        ignores=config.ignore,
        keymap=keymap,
        lang=options.lang,
        mime=options.mimetypes,
        open_left=view.open_direction is _OpenDirection.left,
        page_increment=options.page_increment,
        polling_rate=float(options.polling_rate),
        session=options.session,
        show_hidden=options.show_hidden,
        version_ctl=options.version_control,
        view=view_opts,
        width=view.width,
        win_local_opts=view.window_options,
    )

    return settings
コード例 #2
0
ファイル: install.py プロジェクト: hecjhs/nvim2
def maybe_install(nvim: Nvim) -> None:
    UPDATE_LOG.parent.mkdir(parents=True, exist_ok=True)
    try:
        coded = UPDATE_LOG.read_text()
        before: datetime = decode(datetime,
                                  coded,
                                  decoders=(datetime_str_decoder, ))
    except (FileNotFoundError, DecodeError):
        before = datetime(year=1949, month=9, day=21, tzinfo=timezone.utc)

    now = datetime.now(tz=timezone.utc)
    diff = now - before
    if diff.days > 7:
        ans = ask_mc(
            nvim,
            question=LANG("update?"),
            answers=LANG("ask yes/no"),
            answer_key={
                1: 1,
                2: 2
            },
        )
        if ans:
            coded = encode(now, encoders=(datetime_str_encoder, ))
            UPDATE_LOG.write_text(coded)

        if ans == 1:
            open_term(nvim, executable, INSTALL_SCRIPT, "deps", "packages")
コード例 #3
0
def load_text_decors() -> Tuple[IconGlyphSet, TextColourSet]:
    yaml = safe_load(_ICON_BASE.read_bytes())
    json = loads(docker_run(_DOCKERFILE))
    data = merge(json, yaml)
    icon_spec: IconGlyphSet = decode(IconGlyphSet, data, strict=False)
    icon_set = IconGlyphSet(
        ascii=_process_icons(icon_spec.ascii),
        devicons=_process_icons(icon_spec.devicons),
        emoji=_process_icons(icon_spec.emoji),
    )
    colour_spec: TextColourSet = decode(TextColourSet, data, strict=False)
    colour_set = TextColourSet(
        nerdtree_syntax_light=_make_lightmode(_process_colours(colour_spec.nerdtree_syntax_light)),
        nerdtree_syntax_dark=_process_colours(colour_spec.nerdtree_syntax_dark),
    )
    return icon_set, colour_set
コード例 #4
0
def _find_root(nvim: Nvim, _pattern: Any, filename: str,
               bufnr: int) -> Optional[str]:
    pattern: RootPattern = decode(RootPattern, _pattern)
    path = Path(filename)

    for parent in path.parents:
        for member in parent.iterdir():
            name = member.name
            if name in pattern.exact:
                return str(parent)
            else:
                for glob in pattern.glob:
                    if fnmatch(name, glob):
                        return str(parent)
    else:
        if pattern.fallback is RPFallback.none:
            return None
        elif pattern.fallback is RPFallback.cwd:
            return get_cwd(nvim)
        elif pattern.fallback is RPFallback.home:
            return str(Path.home())
        elif pattern.fallback is RPFallback.parent:
            return str(path.parent)
        else:
            never(pattern)
コード例 #5
0
def _update(nvim: Nvim, buf: Buffer, ns: int, derived: Derived) -> Atomic:
    n_hash = derived.hashed
    try:
        p_hash: Sequence[str] = decode(
            Sequence[str], buf_get_var(nvim, buf=buf, key=_FM_HASH_VAR))
    except DecodeError:
        p_hash = ("", )

    atomic = Atomic()
    for (i1, i2), (j1, j2) in trans_inplace(src=p_hash,
                                            dest=n_hash,
                                            unifying=10):
        atomic.buf_clear_namespace(buf, ns, i1, i2)
        atomic.buf_set_lines(buf, i1, i2, True, derived.lines[j1:j2])

        for idx, highlights in enumerate(derived.highlights[j1:j2], start=i1):
            for hl in highlights:
                atomic.buf_add_highlight(buf, ns, hl.group, idx, hl.begin,
                                         hl.end)

        for idx, badges in enumerate(derived.badges[j1:j2], start=i1):
            vtxt = tuple((bdg.text, bdg.group) for bdg in badges)
            atomic.buf_set_virtual_text(buf, ns, idx, vtxt, {})

    atomic.buf_set_var(buf, _FM_HASH_VAR, n_hash)
    return atomic
コード例 #6
0
def load_icon_colours() -> IconColourSet:
    raw = _fetch(_LINGUIST)
    yaml: _GithubSpec = decode(_GithubSpec, safe_load(raw), strict=False)
    github: IconColours = {
        ext: spec.color
        for spec in yaml.values() for ext in spec.extensions if spec.color
    }
    colours = IconColourSet(github=github)
    return colours
コード例 #7
0
def send_req(server: str, req: Req) -> Resp:
    srv = urlparse(server)
    url = urlunparse((srv.scheme, srv.netloc, "/v2/check", None, None, None))
    data = _encode_eq(req)
    try:
        with urlopen(Request(url=url, data=data)) as resp:
            reply = resp.read().decode()
        json = loads(reply)
        linted: Resp = decode(Resp, json, strict=False)
    except (URLError, HTTPError, JSONDecodeError, DecodeError):
        raise
    else:
        return linted
コード例 #8
0
def load_session(cwd: str) -> Session:
    load_path = _session_path(cwd)
    try:
        return decode(Session, _load_json(load_path))
    except Exception:
        return Session(index=None, show_hidden=None, enable_vc=None)
コード例 #9
0
from dataclasses import dataclass
from enum import Enum, auto
from typing import AbstractSet, Sequence

from std2.pickle import decode
from yaml import safe_load

from ..consts import CONF_FMT
from .install import InstallSpec


class FmtType(Enum):
    stream = auto()
    fs = auto()
    lsp = auto()


@dataclass(frozen=True)
class FmtAttrs:
    bin: str
    type: FmtType
    filetypes: AbstractSet[str]
    args: Sequence[str] = ()
    exit_code: int = 0
    install: InstallSpec = InstallSpec()


FmtSpecs = Sequence[FmtAttrs]
fmt_specs: FmtSpecs = decode(FmtSpecs, safe_load(CONF_FMT.open()))
コード例 #10
0
from typing import Sequence

from std2.pickle import decode
from yaml import safe_load

from ..consts import CONF_TOOL
from .install import InstallSpec

ToolSpecs = Sequence[InstallSpec]
tool_specs: ToolSpecs = decode(ToolSpecs, safe_load(CONF_TOOL.open()))
コード例 #11
0
ファイル: linter.py プロジェクト: hecjhs/nvim2
from dataclasses import dataclass
from enum import Enum, auto
from typing import AbstractSet, Sequence

from std2.pickle import decode
from yaml import safe_load

from ..consts import CONF_LINT
from .install import InstallSpec


class LinterType(Enum):
    stream = auto()
    fs = auto()


@dataclass(frozen=True)
class LinterAttrs:
    bin: str
    type: LinterType
    filetypes: AbstractSet[str]
    args: Sequence[str] = ()
    exit_code: int = 0
    install: InstallSpec = InstallSpec()


LinterSpecs = Sequence[LinterAttrs]
linter_specs: LinterSpecs = decode(LinterSpecs, safe_load(CONF_LINT.open()))
コード例 #12
0
def load_ls_colours() -> LSColourSet:
    json = loads(docker_run(_DOCKERFILE))
    lsc: LSColourSet = decode(LSColourSet, json)
    return lsc
コード例 #13
0
from ..consts import CONF_PKGS
from .install import ScriptSpec


@dataclass(frozen=True)
class GitPkgSpec:
    uri: str
    branch: Optional[str] = None
    script: ScriptSpec = ScriptSpec()


@dataclass(frozen=True)
class KeymapSpec:
    modes: str
    maps: Mapping[str, str]
    opts: KeymapOpts = KeymapOpts()


@dataclass(frozen=True)
class PkgAttrs:
    git: GitPkgSpec
    keys: Sequence[KeymapSpec] = ()
    vals: Mapping[str, Any] = field(default_factory=dict)
    lua: str = ""
    viml: str = ""


PkgSpecs = Sequence[PkgAttrs]
pkg_specs: PkgSpecs = decode(PkgSpecs, safe_load(CONF_PKGS.open()))
コード例 #14
0

class RPFallback(Enum):
    none = auto()
    cwd = auto()
    home = auto()
    parent = auto()


@dataclass(frozen=True)
class RootPattern:
    fallback: RPFallback = RPFallback.cwd
    exact: AbstractSet[str] = frozenset()
    glob: Sequence[str] = ()


@dataclass(frozen=True)
class LspAttrs:
    server: str
    bin: str
    args: Optional[Sequence[str]] = None
    filetypes: AbstractSet[str] = frozenset()
    root: Optional[RootPattern] = None
    init_options: Mapping[str, Any] = field(default_factory=dict)
    settings: Mapping[str, Any] = field(default_factory=dict)
    install: InstallSpec = InstallSpec()


LspSpecs = Sequence[LspAttrs]
lsp_specs: LspSpecs = decode(LspSpecs, safe_load(CONF_LSP.open()))