Patchwork [1,of,3,STABLE,V2] pager: rename 'pager.enable' to 'ui.pager'

login
register
mail settings
Submitter Pierre-Yves David
Date May 1, 2017, 8:29 p.m.
Message ID <853bf9ca7b3b1f4d8f54.1493670561@nodosa.octopoid.net>
Download mbox | patch
Permalink /patch/20345/
State Superseded
Headers show

Comments

Pierre-Yves David - May 1, 2017, 8:29 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@ens-lyon.org>
# Date 1493649410 -7200
#      Mon May 01 16:36:50 2017 +0200
# Branch stable
# Node ID 853bf9ca7b3b1f4d8f54ed8c60ff92371132c097
# Parent  ad70a36b5b472c295bfdb849ba69eac871305b36
# EXP-Topic pager
# Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
#              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 853bf9ca7b3b
pager: rename 'pager.enable' to 'ui.pager'

This aligns with what we do for color (see 7fec37746417). Pager is a central
enough notion that having the master config in the [ui] section makes senses. It
will helps with consistency, discoverability. It will also help having a simple
and clear example hgrc mentioning pager.

The previous form of the option had never been released in a non-rc version but
we keep it around for convenience. If both are set, 'ui.pager' take priority.
Augie Fackler - May 2, 2017, 1:22 a.m.
On Mon, May 01, 2017 at 10:29:21PM +0200, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david@ens-lyon.org>
> # Date 1493649410 -7200
> #      Mon May 01 16:36:50 2017 +0200
> # Branch stable
> # Node ID 853bf9ca7b3b1f4d8f54ed8c60ff92371132c097
> # Parent  ad70a36b5b472c295bfdb849ba69eac871305b36
> # EXP-Topic pager
> # Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
> #              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 853bf9ca7b3b
> pager: rename 'pager.enable' to 'ui.pager'

Mentioned this on the other thread, but in brief here so it doesn't
get overlooked: I think ui.pager is confusing as a boolean when
ui.editor already exists and is a program to invoke. They sound
related to me.

>
> This aligns with what we do for color (see 7fec37746417). Pager is a central
> enough notion that having the master config in the [ui] section makes senses. It
> will helps with consistency, discoverability. It will also help having a simple
> and clear example hgrc mentioning pager.
>
> The previous form of the option had never been released in a non-rc version but
> we keep it around for convenience. If both are set, 'ui.pager' take priority.
>
> diff --git a/mercurial/help/pager.txt b/mercurial/help/pager.txt
> --- a/mercurial/help/pager.txt
> +++ b/mercurial/help/pager.txt
> @@ -29,7 +29,7 @@ you can use --pager=<value>:
>
>  To globally turn off all attempts to use a pager, set::
>
> -  [pager]
> -  enable = false
> +  [ui]
> +  pager = false
>
>  which will prevent the pager from running.
> diff --git a/mercurial/ui.py b/mercurial/ui.py
> --- a/mercurial/ui.py
> +++ b/mercurial/ui.py
> @@ -848,7 +848,8 @@ class ui(object):
>          if (self._disablepager
>              or self.pageractive
>              or command in self.configlist('pager', 'ignore')
> -            or not self.configbool('pager', 'enable', True)
> +            or not self.configbool('ui', 'pager',
> +                                   self.configbool('pager', 'enable', True))
>              or not self.configbool('pager', 'attend-' + command, True)
>              # TODO: if we want to allow HGPLAINEXCEPT=pager,
>              # formatted() will need some adjustment.
> diff --git a/tests/test-pager.t b/tests/test-pager.t
> --- a/tests/test-pager.t
> +++ b/tests/test-pager.t
> @@ -54,21 +54,21 @@ By default diff and log are paged, but i
>
>  We can control the pager from the config
>
> -  $ hg log --limit 1 --config 'pager.enable=False'
> +  $ hg log --limit 1 --config 'ui.pager=False'
>    changeset:   10:46106edeeb38
>    tag:         tip
>    user:        test
>    date:        Thu Jan 01 00:00:00 1970 +0000
>    summary:     modify a 10
>
> -  $ hg log --limit 1 --config 'pager.enable=0'
> +  $ hg log --limit 1 --config 'ui.pager=0'
>    changeset:   10:46106edeeb38
>    tag:         tip
>    user:        test
>    date:        Thu Jan 01 00:00:00 1970 +0000
>    summary:     modify a 10
>
> -  $ hg log --limit 1 --config 'pager.enable=1'
> +  $ hg log --limit 1 --config 'ui.pager=1'
>    paged! 'changeset:   10:46106edeeb38\n'
>    paged! 'tag:         tip\n'
>    paged! 'user:        test\n'
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Yuya Nishihara - May 2, 2017, 2:34 a.m.
On Mon, 1 May 2017 21:22:02 -0400, Augie Fackler wrote:
> On Mon, May 01, 2017 at 10:29:21PM +0200, Pierre-Yves David wrote:
> > # HG changeset patch
> > # User Pierre-Yves David <pierre-yves.david@ens-lyon.org>
> > # Date 1493649410 -7200
> > #      Mon May 01 16:36:50 2017 +0200
> > # Branch stable
> > # Node ID 853bf9ca7b3b1f4d8f54ed8c60ff92371132c097
> > # Parent  ad70a36b5b472c295bfdb849ba69eac871305b36
> > # EXP-Topic pager
> > # Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
> > #              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 853bf9ca7b3b
> > pager: rename 'pager.enable' to 'ui.pager'
> 
> Mentioned this on the other thread, but in brief here so it doesn't
> get overlooked: I think ui.pager is confusing as a boolean when
> ui.editor already exists and is a program to invoke. They sound
> related to me.

Agreed. pager.enable is a bit unfortunate, but 'ui.pager = <bool>' is more
confusing.
Pierre-Yves David - May 2, 2017, 11:03 a.m.
On 05/02/2017 04:34 AM, Yuya Nishihara wrote:
> On Mon, 1 May 2017 21:22:02 -0400, Augie Fackler wrote:
>> On Mon, May 01, 2017 at 10:29:21PM +0200, Pierre-Yves David wrote:
>>> # HG changeset patch
>>> # User Pierre-Yves David <pierre-yves.david@ens-lyon.org>
>>> # Date 1493649410 -7200
>>> #      Mon May 01 16:36:50 2017 +0200
>>> # Branch stable
>>> # Node ID 853bf9ca7b3b1f4d8f54ed8c60ff92371132c097
>>> # Parent  ad70a36b5b472c295bfdb849ba69eac871305b36
>>> # EXP-Topic pager
>>> # Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
>>> #              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 853bf9ca7b3b
>>> pager: rename 'pager.enable' to 'ui.pager'
>>
>> Mentioned this on the other thread, but in brief here so it doesn't
>> get overlooked: I think ui.pager is confusing as a boolean when
>> ui.editor already exists and is a program to invoke. They sound
>> related to me.
>
> Agreed. pager.enable is a bit unfortunate, but 'ui.pager = <bool>' is more
> confusing.

Given that gathering main interface knob in `[ui]`, maybe we can find 
something else that fit both constraint (in [ui]; not confusing with 
ui.editor).

I can think about `ui.use-pager` and `ui.paginate`.

What do you think ?

(On related new, `pager.enable=<bool>` seems a bit off with 
`pager.ignore=<list>`. Especially since we need a counter-part to 
`pager.ignore=<list>` that could be `pager.enable=<list>`)
Yuya Nishihara - May 2, 2017, 1:57 p.m.
On Tue, 2 May 2017 13:03:46 +0200, Pierre-Yves David wrote:
> On 05/02/2017 04:34 AM, Yuya Nishihara wrote:
> > On Mon, 1 May 2017 21:22:02 -0400, Augie Fackler wrote:
> >> On Mon, May 01, 2017 at 10:29:21PM +0200, Pierre-Yves David wrote:
> >>> # HG changeset patch
> >>> # User Pierre-Yves David <pierre-yves.david@ens-lyon.org>
> >>> # Date 1493649410 -7200
> >>> #      Mon May 01 16:36:50 2017 +0200
> >>> # Branch stable
> >>> # Node ID 853bf9ca7b3b1f4d8f54ed8c60ff92371132c097
> >>> # Parent  ad70a36b5b472c295bfdb849ba69eac871305b36
> >>> # EXP-Topic pager
> >>> # Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
> >>> #              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 853bf9ca7b3b
> >>> pager: rename 'pager.enable' to 'ui.pager'
> >>
> >> Mentioned this on the other thread, but in brief here so it doesn't
> >> get overlooked: I think ui.pager is confusing as a boolean when
> >> ui.editor already exists and is a program to invoke. They sound
> >> related to me.
> >
> > Agreed. pager.enable is a bit unfortunate, but 'ui.pager = <bool>' is more
> > confusing.
> 
> Given that gathering main interface knob in `[ui]`, maybe we can find 
> something else that fit both constraint (in [ui]; not confusing with 
> ui.editor).
> 
> I can think about `ui.use-pager` and `ui.paginate`.
> 
> What do you think ?

+0. I'm not so enthusiastic about moving things into the [ui] section.

> (On related new, `pager.enable=<bool>` seems a bit off with 
> `pager.ignore=<list>`. Especially since we need a counter-part to 
> `pager.ignore=<list>` that could be `pager.enable=<list>`)

IIRC, pager.ignore is kinda deprecated since the list can't be partially
overridden. Modern way is to set pager.attend-<command>.
Augie Fackler - May 2, 2017, 2:02 p.m.
> On May 2, 2017, at 09:57, Yuya Nishihara <yuya@tcha.org> wrote:
> 
> On Tue, 2 May 2017 13:03:46 +0200, Pierre-Yves David wrote:
>> On 05/02/2017 04:34 AM, Yuya Nishihara wrote:
>>> On Mon, 1 May 2017 21:22:02 -0400, Augie Fackler wrote:
>>>> On Mon, May 01, 2017 at 10:29:21PM +0200, Pierre-Yves David wrote:
>>>>> # HG changeset patch
>>>>> # User Pierre-Yves David <pierre-yves.david@ens-lyon.org>
>>>>> # Date 1493649410 -7200
>>>>> #      Mon May 01 16:36:50 2017 +0200
>>>>> # Branch stable
>>>>> # Node ID 853bf9ca7b3b1f4d8f54ed8c60ff92371132c097
>>>>> # Parent  ad70a36b5b472c295bfdb849ba69eac871305b36
>>>>> # EXP-Topic pager
>>>>> # Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
>>>>> #              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 853bf9ca7b3b
>>>>> pager: rename 'pager.enable' to 'ui.pager'
>>>> 
>>>> Mentioned this on the other thread, but in brief here so it doesn't
>>>> get overlooked: I think ui.pager is confusing as a boolean when
>>>> ui.editor already exists and is a program to invoke. They sound
>>>> related to me.
>>> 
>>> Agreed. pager.enable is a bit unfortunate, but 'ui.pager = <bool>' is more
>>> confusing.
>> 
>> Given that gathering main interface knob in `[ui]`, maybe we can find 
>> something else that fit both constraint (in [ui]; not confusing with 
>> ui.editor).
>> 
>> I can think about `ui.use-pager` and `ui.paginate`.
>> 
>> What do you think ?
> 
> +0. I'm not so enthusiastic about moving things into the [ui] section.

I don't feel terribly strongly either way on moving things to [ui] - I see both sides of the argument. I think paginate is better than use-pager.

> 
>> (On related new, `pager.enable=<bool>` seems a bit off with 
>> `pager.ignore=<list>`. Especially since we need a counter-part to 
>> `pager.ignore=<list>` that could be `pager.enable=<list>`)
> 
> IIRC, pager.ignore is kinda deprecated since the list can't be partially
> overridden. Modern way is to set pager.attend-<command>.

Right now we don't have a way (other than the deprecated pager extension) to forcibly paginate a command that doesn't request pagination. That might be a better use for pager.enable=<list> than the existing pager.enable=<bool> when viewed in light of the existing pager.ignore setting.

Kevin, what do you think? I'd like to get this sorted today so we can release today.
Pierre-Yves David - May 2, 2017, 2:28 p.m.
On 05/02/2017 04:02 PM, Augie Fackler wrote:
>
>> On May 2, 2017, at 09:57, Yuya Nishihara <yuya@tcha.org> wrote:
>>
>> On Tue, 2 May 2017 13:03:46 +0200, Pierre-Yves David wrote:
>>> On 05/02/2017 04:34 AM, Yuya Nishihara wrote:
>>>> On Mon, 1 May 2017 21:22:02 -0400, Augie Fackler wrote:
>>>>> On Mon, May 01, 2017 at 10:29:21PM +0200, Pierre-Yves David wrote:
>>>>>> # HG changeset patch
>>>>>> # User Pierre-Yves David <pierre-yves.david@ens-lyon.org>
>>>>>> # Date 1493649410 -7200
>>>>>> #      Mon May 01 16:36:50 2017 +0200
>>>>>> # Branch stable
>>>>>> # Node ID 853bf9ca7b3b1f4d8f54ed8c60ff92371132c097
>>>>>> # Parent  ad70a36b5b472c295bfdb849ba69eac871305b36
>>>>>> # EXP-Topic pager
>>>>>> # Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
>>>>>> #              hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 853bf9ca7b3b
>>>>>> pager: rename 'pager.enable' to 'ui.pager'
>>>>>
>>>>> Mentioned this on the other thread, but in brief here so it doesn't
>>>>> get overlooked: I think ui.pager is confusing as a boolean when
>>>>> ui.editor already exists and is a program to invoke. They sound
>>>>> related to me.
>>>>
>>>> Agreed. pager.enable is a bit unfortunate, but 'ui.pager = <bool>' is more
>>>> confusing.
>>>
>>> Given that gathering main interface knob in `[ui]`, maybe we can find
>>> something else that fit both constraint (in [ui]; not confusing with
>>> ui.editor).
>>>
>>> I can think about `ui.use-pager` and `ui.paginate`.
>>>
>>> What do you think ?
>>
>> +0. I'm not so enthusiastic about moving things into the [ui] section.
>
> I don't feel terribly strongly either way on moving things to [ui] - I see both sides of the argument. I think paginate is better than use-pager.
>
>>
>>> (On related new, `pager.enable=<bool>` seems a bit off with
>>> `pager.ignore=<list>`. Especially since we need a counter-part to
>>> `pager.ignore=<list>` that could be `pager.enable=<list>`)
>>
>> IIRC, pager.ignore is kinda deprecated since the list can't be partially
>> overridden. Modern way is to set pager.attend-<command>.
>
> Right now we don't have a way (other than the deprecated pager extension) to forcibly paginate a command that doesn't request pagination. That might be a better use for pager.enable=<list> than the existing pager.enable=<bool> when viewed in light of the existing pager.ignore setting.
>
> Kevin, what do you think? I'd like to get this sorted today so we can release today.

Should I sent a V3, using `ui.paginate` so that the code is ready 
whatever the decision is?

(there are a good chance I go AFK in about 3 hour)

Cheers,
Augie Fackler - May 2, 2017, 2:54 p.m.
On May 2, 2017 10:28 AM, "Pierre-Yves David" <pierre-yves.david@ens-lyon.org>
wrote:



On 05/02/2017 04:02 PM, Augie Fackler wrote:

>
> On May 2, 2017, at 09:57, Yuya Nishihara <yuya@tcha.org> wrote:
>>
>> On Tue, 2 May 2017 13:03:46 +0200, Pierre-Yves David wrote:
>>
>>> On 05/02/2017 04:34 AM, Yuya Nishihara wrote:
>>>
>>>> On Mon, 1 May 2017 21:22:02 -0400, Augie Fackler wrote:
>>>>
>>>>> On Mon, May 01, 2017 at 10:29:21PM +0200, Pierre-Yves David wrote:
>>>>>
>>>>>> # HG changeset patch
>>>>>> # User Pierre-Yves David <pierre-yves.david@ens-lyon.org>
>>>>>> # Date 1493649410 -7200
>>>>>> #      Mon May 01 16:36:50 2017 +0200
>>>>>> # Branch stable
>>>>>> # Node ID 853bf9ca7b3b1f4d8f54ed8c60ff92371132c097
>>>>>> # Parent  ad70a36b5b472c295bfdb849ba69eac871305b36
>>>>>> # EXP-Topic pager
>>>>>> # Available At https://www.mercurial-scm.org/
>>>>>> repo/users/marmoute/mercurial/
>>>>>> #              hg pull https://www.mercurial-scm.org/
>>>>>> repo/users/marmoute/mercurial/ -r 853bf9ca7b3b
>>>>>> pager: rename 'pager.enable' to 'ui.pager'
>>>>>>
>>>>>
>>>>> Mentioned this on the other thread, but in brief here so it doesn't
>>>>> get overlooked: I think ui.pager is confusing as a boolean when
>>>>> ui.editor already exists and is a program to invoke. They sound
>>>>> related to me.
>>>>>
>>>>
>>>> Agreed. pager.enable is a bit unfortunate, but 'ui.pager = <bool>' is
>>>> more
>>>> confusing.
>>>>
>>>
>>> Given that gathering main interface knob in `[ui]`, maybe we can find
>>> something else that fit both constraint (in [ui]; not confusing with
>>> ui.editor).
>>>
>>> I can think about `ui.use-pager` and `ui.paginate`.
>>>
>>> What do you think ?
>>>
>>
>> +0. I'm not so enthusiastic about moving things into the [ui] section.
>>
>
> I don't feel terribly strongly either way on moving things to [ui] - I see
> both sides of the argument. I think paginate is better than use-pager.
>
>
>> (On related new, `pager.enable=<bool>` seems a bit off with
>>> `pager.ignore=<list>`. Especially since we need a counter-part to
>>> `pager.ignore=<list>` that could be `pager.enable=<list>`)
>>>
>>
>> IIRC, pager.ignore is kinda deprecated since the list can't be partially
>> overridden. Modern way is to set pager.attend-<command>.
>>
>
> Right now we don't have a way (other than the deprecated pager extension)
> to forcibly paginate a command that doesn't request pagination. That might
> be a better use for pager.enable=<list> than the existing
> pager.enable=<bool> when viewed in light of the existing pager.ignore
> setting.
>
> Kevin, what do you think? I'd like to get this sorted today so we can
> release today.
>

Should I sent a V3, using `ui.paginate` so that the code is ready whatever
the decision is?


Please do.


(there are a good chance I go AFK in about 3 hour)

Cheers,
Pierre-Yves David - May 2, 2017, 4:20 p.m.
On 05/02/2017 06:00 PM, Kevin Bullock wrote:
>> On May 2, 2017, at 09:02, Augie Fackler <raf@durin42.com> wrote:
>>
>>> On May 2, 2017, at 09:57, Yuya Nishihara <yuya@tcha.org> wrote:
>>>
>>> On Tue, 2 May 2017 13:03:46 +0200, Pierre-Yves David wrote:
>>>> On 05/02/2017 04:34 AM, Yuya Nishihara wrote:
>>>>> On Mon, 1 May 2017 21:22:02 -0400, Augie Fackler wrote:
>>>>>> Mentioned this on the other thread, but in brief here so it doesn't
>>>>>> get overlooked: I think ui.pager is confusing as a boolean when
>>>>>> ui.editor already exists and is a program to invoke. They sound
>>>>>> related to me.
>>>>>
>>>>> Agreed. pager.enable is a bit unfortunate, but 'ui.pager = <bool>' is more
>>>>> confusing.
>>>>
>>>> Given that gathering main interface knob in `[ui]`, maybe we can find
>>>> something else that fit both constraint (in [ui]; not confusing with
>>>> ui.editor).
>>>>
>>>> I can think about `ui.use-pager` and `ui.paginate`.
>>>>
>>>> What do you think ?
>>>
>>> +0. I'm not so enthusiastic about moving things into the [ui] section.
>>
>> I don't feel terribly strongly either way on moving things to [ui] - I see both sides of the argument. I think paginate is better than use-pager.
>>
>> [...]
>> Kevin, what do you think? I'd like to get this sorted today so we can release today.
>
> I'm inclined to leave the boolean option named pager.enable in light of
> all the other options. It's not ideal, but I think it strikes the best
> balance of consistency w/other options and discoverability, given that
> we've already rolled an RC with it.
>
> I'll outline various options to clarify them (to myself!):
>
> 0) pager.pager = <command>  # current situation
>    pager.enable = <bool>
>
> 1) ui.pager = <bool>        # consistent with ui.color
>    pager.pager = <command>
>
>    This is what's proposed in this series. As mentioned above I don't
>    think this is a great balance of consistency with all the other knobs
>    we've discussed.
>
> 2) ui.pager = <command>     # consistent with ui.editor
>    pager.enable = <bool>
>
>    If we have a ui.pager setting, it ought to match ui.editor more
>    closely than ui.color.  But this option splits pager config across
>    multiple sections with no apparent purpose.
>
> 3) ui.pager = <command>
>    ui.paginate = <bool>
>
>    This is a bit better, but still leaves the rest of the pager.*
>    options in a different section. ui.color is already in that
>    situation, though, so this is might be an interesting
>    alternative. This is (modulo 'use-') Pierre-Yves' most recent
>    proposal.

My last proposal is actually a bit different:

4) ui.paginate = <bool>
    pager.pager = <command>

My rational here is that `ui.paginate` is the option most user are 
likely to care about (given we have a good default pager), so we put is 
in '[ui]'. The rest of the option affecting the pager behavior stay in a 
dedicated config '[pager]' as they are likely to be touched by more 
advance user only.

This is similar to what we do for color.

Patch

diff --git a/mercurial/help/pager.txt b/mercurial/help/pager.txt
--- a/mercurial/help/pager.txt
+++ b/mercurial/help/pager.txt
@@ -29,7 +29,7 @@  you can use --pager=<value>:
 
 To globally turn off all attempts to use a pager, set::
 
-  [pager]
-  enable = false
+  [ui]
+  pager = false
 
 which will prevent the pager from running.
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -848,7 +848,8 @@  class ui(object):
         if (self._disablepager
             or self.pageractive
             or command in self.configlist('pager', 'ignore')
-            or not self.configbool('pager', 'enable', True)
+            or not self.configbool('ui', 'pager',
+                                   self.configbool('pager', 'enable', True))
             or not self.configbool('pager', 'attend-' + command, True)
             # TODO: if we want to allow HGPLAINEXCEPT=pager,
             # formatted() will need some adjustment.
diff --git a/tests/test-pager.t b/tests/test-pager.t
--- a/tests/test-pager.t
+++ b/tests/test-pager.t
@@ -54,21 +54,21 @@  By default diff and log are paged, but i
 
 We can control the pager from the config
 
-  $ hg log --limit 1 --config 'pager.enable=False'
+  $ hg log --limit 1 --config 'ui.pager=False'
   changeset:   10:46106edeeb38
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     modify a 10
   
-  $ hg log --limit 1 --config 'pager.enable=0'
+  $ hg log --limit 1 --config 'ui.pager=0'
   changeset:   10:46106edeeb38
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     modify a 10
   
-  $ hg log --limit 1 --config 'pager.enable=1'
+  $ hg log --limit 1 --config 'ui.pager=1'
   paged! 'changeset:   10:46106edeeb38\n'
   paged! 'tag:         tip\n'
   paged! 'user:        test\n'