From 6a3111f3340a495944f1475c8dc24d5eeac416fd Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Tue, 24 May 2016 11:24:13 -0400 Subject: [PATCH 1/6] add completions to ${...} --- CHANGELOG.rst | 2 ++ xonsh/completer.py | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2152ca398..e3e7887fe 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,6 +11,8 @@ Current Developments * Added comma literals to subproc mode. * ``@$(cmd)`` has been added as a subprocess-mode operator, which replaces in the subprocess command itself with the result of running ``cmd``. +* The ``${...}`` shortcut for ``__xonsh_env__`` now returns appropriate + completion options **Changed:** diff --git a/xonsh/completer.py b/xonsh/completer.py index b911c0a02..935c6ffe5 100644 --- a/xonsh/completer.py +++ b/xonsh/completer.py @@ -526,11 +526,11 @@ class Completer(object): expr = subexpr_from_unbalanced(expr, '{', '}') _ctx = None try: - val = eval(expr, ctx) + val = builtins.__xonsh_execer__.eval(expr, ctx) _ctx = ctx except: # pylint:disable=bare-except try: - val = eval(expr, builtins.__dict__) + val = builtins.__xonsh_execer__.eval(expr, builtins.__dict__) _ctx = builtins.__dict__ except: # pylint:disable=bare-except return attrs # anything could have gone wrong! @@ -539,7 +539,7 @@ class Completer(object): opts = [] for i in _opts: try: - eval('{0}.{1}'.format(expr, i), _ctx) + builtins.__xonsh_execer__.eval('{0}.{1}'.format(expr, i), _ctx) except: # pylint:disable=bare-except continue else: From 65e1b8d6fe4b894fa818e025eb69492cad522f46 Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Tue, 24 May 2016 15:46:42 -0400 Subject: [PATCH 2/6] extend python mode completions to a good(?) place --- xonsh/completer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xonsh/completer.py b/xonsh/completer.py index 935c6ffe5..8e17c34aa 100644 --- a/xonsh/completer.py +++ b/xonsh/completer.py @@ -197,7 +197,7 @@ class Completer(object): return sorted(self._replace_canonical_rep(comps, pathcomp)), lprefix elif prefix.startswith('${') or prefix.startswith('@('): # python mode explicitly - return self._python_mode_completions(prefix, ctx, + rtn = self._python_mode_completions(prefix, ctx, prefixlow, startswither) elif prefix.startswith('-'): From 755d2cecba81ef4b3411f0a2f508c6d9f97298df Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Wed, 25 May 2016 09:03:46 -0400 Subject: [PATCH 3/6] prevent called function attribute completion --- xonsh/completer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xonsh/completer.py b/xonsh/completer.py index 8e17c34aa..4fc54651d 100644 --- a/xonsh/completer.py +++ b/xonsh/completer.py @@ -525,6 +525,8 @@ class Completer(object): expr = subexpr_from_unbalanced(expr, '[', ']') expr = subexpr_from_unbalanced(expr, '{', '}') _ctx = None + if expr.endswith('()'): + return attrs try: val = builtins.__xonsh_execer__.eval(expr, ctx) _ctx = ctx From 8ccaf558bd890bbb87ae1f3e5b6c17fbddd06f0b Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Wed, 25 May 2016 14:38:35 -0400 Subject: [PATCH 4/6] make sure completer doesn't evaluate functions --- xonsh/completer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xonsh/completer.py b/xonsh/completer.py index 4fc54651d..83ce94288 100644 --- a/xonsh/completer.py +++ b/xonsh/completer.py @@ -197,9 +197,9 @@ class Completer(object): return sorted(self._replace_canonical_rep(comps, pathcomp)), lprefix elif prefix.startswith('${') or prefix.startswith('@('): # python mode explicitly - rtn = self._python_mode_completions(prefix, ctx, + return self._python_mode_completions(prefix, ctx, prefixlow, - startswither) + startswither), lprefix elif prefix.startswith('-'): comps = self._man_completer.option_complete(prefix, cmd) return sorted(comps), lprefix From 5ebeb6c86456026c35df30994509015491545c2e Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Wed, 25 May 2016 16:23:08 -0400 Subject: [PATCH 5/6] make happy regex funtimes for all This may, or may not, be the thing that finally stops arbitrary function execution in the completer. --- xonsh/completer.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/xonsh/completer.py b/xonsh/completer.py index 83ce94288..ee9c7ee83 100644 --- a/xonsh/completer.py +++ b/xonsh/completer.py @@ -19,7 +19,7 @@ from xonsh.tools import (subexpr_from_unbalanced, get_sep, RE_DASHF = re.compile(r'-F\s+(\w+)') -RE_ATTR = re.compile(r'(\S+(\..+)*)\.(\w*)$') +RE_ATTR = re.compile(r'([^\s\(\)]+(\..+)*)\.(\w*)$') RE_WIN_DRIVE = re.compile(r'^([a-zA-Z]):\\') @@ -525,8 +525,6 @@ class Completer(object): expr = subexpr_from_unbalanced(expr, '[', ']') expr = subexpr_from_unbalanced(expr, '{', '}') _ctx = None - if expr.endswith('()'): - return attrs try: val = builtins.__xonsh_execer__.eval(expr, ctx) _ctx = ctx From bead5eecfe62c9cb05d75b7496c2caa2ae82c886 Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Wed, 25 May 2016 17:06:39 -0400 Subject: [PATCH 6/6] one more shot at regex completion stuff I should know better than to argue with @melund --- xonsh/completer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xonsh/completer.py b/xonsh/completer.py index ee9c7ee83..0a3ebf252 100644 --- a/xonsh/completer.py +++ b/xonsh/completer.py @@ -19,7 +19,7 @@ from xonsh.tools import (subexpr_from_unbalanced, get_sep, RE_DASHF = re.compile(r'-F\s+(\w+)') -RE_ATTR = re.compile(r'([^\s\(\)]+(\..+)*)\.(\w*)$') +RE_ATTR = re.compile(r'([^\s\(\)]+(\.[^\s\(\)]+)*)\.(\w*)$') RE_WIN_DRIVE = re.compile(r'^([a-zA-Z]):\\')