mirror of
https://github.com/xonsh/xonsh.git
synced 2025-03-04 08:24:40 +01:00
add fish shell based completer (#4569)
* feat: add fish shell based completer * refactor: use filter-func to filter results
This commit is contained in:
parent
d5c6c9e4e6
commit
b031047beb
2 changed files with 66 additions and 0 deletions
23
news/fish-completer.rst
Normal file
23
news/fish-completer.rst
Normal file
|
@ -0,0 +1,23 @@
|
|||
**Added:**
|
||||
|
||||
* `xontrib.fish_completer` is available to complete using `fish` shell.
|
||||
|
||||
**Changed:**
|
||||
|
||||
* <news item>
|
||||
|
||||
**Deprecated:**
|
||||
|
||||
* <news item>
|
||||
|
||||
**Removed:**
|
||||
|
||||
* <news item>
|
||||
|
||||
**Fixed:**
|
||||
|
||||
* <news item>
|
||||
|
||||
**Security:**
|
||||
|
||||
* <news item>
|
43
xontrib/fish_completer.py
Normal file
43
xontrib/fish_completer.py
Normal file
|
@ -0,0 +1,43 @@
|
|||
from xonsh.completers import completer
|
||||
from xonsh.completers.tools import (
|
||||
RichCompletion,
|
||||
contextual_command_completer,
|
||||
get_filter_function,
|
||||
)
|
||||
|
||||
import subprocess as sp
|
||||
from xonsh.built_ins import XSH
|
||||
from xonsh.parsers.completion_context import CommandContext
|
||||
|
||||
|
||||
def create_rich_completion(line: str):
|
||||
line = line.strip()
|
||||
if "\t" in line:
|
||||
cmd, desc = map(str.strip, line.split("\t", maxsplit=1))
|
||||
else:
|
||||
cmd, desc = line, ""
|
||||
return RichCompletion(
|
||||
str(cmd),
|
||||
description=str(desc),
|
||||
append_space=True,
|
||||
)
|
||||
|
||||
|
||||
@contextual_command_completer
|
||||
def fish_proc_completer(ctx: CommandContext):
|
||||
"""Populate completions using fish shell and remove bash-completer"""
|
||||
args = [arg.value for arg in ctx.args] + [ctx.prefix]
|
||||
line = " ".join(args)
|
||||
args = ["fish", "-c", f"complete -C '{line}'"]
|
||||
env = XSH.env.detype()
|
||||
output = sp.check_output(args, env=env).decode()
|
||||
filter_func = get_filter_function()
|
||||
|
||||
if output:
|
||||
for line in output.strip().splitlines(keepends=False):
|
||||
comp = create_rich_completion(line)
|
||||
if filter_func(comp, ctx.prefix):
|
||||
yield comp
|
||||
|
||||
|
||||
completer.add_one_completer("fish", fish_proc_completer, "<bash")
|
Loading…
Add table
Reference in a new issue