[IPython-dev] [IPython 5] [Docs] Custom Terminal Prompts
Yuri Numerov
achi at hush.ai
Wed Jul 13 01:33:14 EDT 2016
Thanks a ton for this Carl, I spent some time trying to figure this out myself when ipython 5 came out without luck :)
On 13/07/2016 at 2:34 AM, "Carl Smith" <carl.input at gmail.com> wrote:
>
>It's working now. Thanks for your help with that. It was what
>Thomas said.
>
>Looking through the IPython repo, it turns out there's already a
>commit
>that added a couple of examples of how to do this, so maybe just
>need to
>move some existing stuff around. If I'd found those examples, and
>the link
>Thomas suggested (to the default class definition), it would have
>been easy
>to figure out from there.
>
>The commit that adds the examples:
>https://github.com/ipython/ipython/commit/95ed0855ae23e55c10b46903d
>b911265aa1cdd58#diff-c5d5abe11d1c298906cb121c45eb12e2
>
>I did put a simple example together before I saw those, and you're
>welcome
>to use it too. It just creates more minimal versions of the
>standard
>prompts to save some space:
>
>[*1*]* $ def* *inc*(x):
> *$* *return* x + 1
> *$*
>
>
>[*2*] *$* inc 1
>*---->* inc(1)
>[*2] :* 2
>
>The code is pretty compact too:
>
>*from IPython.terminal.prompts import Prompts, Token*
>
>*class CustomPrompts(Prompts):*
>
>* def in_prompt_tokens(self, cli=None): return [*
>* (Token.Prompt, "["),*
>* (Token.PromptNum, str(self.shell.execution_count)),*
>* (Token.Prompt, "] $ ")*
>* ]*
>
>* def out_prompt_tokens(self): return [*
>* (Token.OutPrompt, "["),*
>* (Token.OutPromptNum, str(self.shell.execution_count)),*
>* (Token.OutPrompt, "] : ")*
>* ]*
>
>* def continuation_prompt_tokens(self, cli=None, width=None):*
>* if width is None: width = self._width()*
>* return [(Token.Prompt, " " * (width - 5) + " $ ")]*
>
>*ip = get_ipython()*
>*ip.prompts = CustomPrompts(ip)*
>
>One thing I found buggy was the rewrite prompt. If you inherit from
>`Prompt` and redefine some of the prompt methods in the derived
>class, as
>you're meant to do, any prompts that you inherit from `Prompt`
>will pad
>themselves out to keep everything aligned. This works well except
>when you
>have a multiline prompt.
>
>Prompts can get pretty lengthy, and you don't really want
>multiline inputs
>starting at column 50, so two-line prompts with a really short
>second line
>will be fairly common.
>
>If you create a multiline Input prompt, the rewrite prompt will
>end up
>being too long. The math in the token assumes the Input prompt is
>all on
>one line.
>
>def rewrite_prompt_tokens(self): width = self._width() return [
>(Token.Prompt, ('-' * (width - 2)) + '> '), ]
>
>I'm happy to do some work on the docs, but not sure what should be
>done
>exactly. It's getting late here again (1:30am), so it'll have to be
>tomorrow now anyway.
>
>Best,
>
>
>-- Carl Smith
>carl.input at gmail.com
>
>On 11 July 2016 at 21:20, Thomas Kluyver <takowl at gmail.com> wrote:
>
>> On 11 July 2016 at 21:12, Carl Smith <carl.input at gmail.com>
>wrote:
>>
>>> On the PR, should I put the example code right there in the
>docs, where
>>> the API is explained, or is there a wiki or something? Happy
>either way.
>>> Just unsure what's correct these days.
>>
>>
>> In the docs themselves would be great - thanks!
>>
>> _______________________________________________
>> IPython-dev mailing list
>> IPython-dev at scipy.org
>> https://mail.scipy.org/mailman/listinfo/ipython-dev
>>
>>
More information about the IPython-dev
mailing list