Обсуждение: psql: \pset pager 'always'?

Поиск
Список
Период
Сортировка

psql: \pset pager 'always'?

От
Antti Haapala
Дата:
I don't know if this is already done, but...

I'm really annoyed by that little 'feature' of psql that decides whether
to use pager or not. I personally use GNU 'less' with options -S -F as my
pager, which allows me to scroll vertically AS WELL AS horizontally on
long input. So a "use pager always"  option with no strange automagic
behaviour would be nice. Or do you consider this being readable (copyed
verbatim from terminal window):

template1=# select * from pg_class limit 1;
relname | reltype | relowner | relam | relfilenode | relpages | reltuples |
reltoastrelid | reltoastidxid | relhasindex | relisshared | relkind |
relnatts | relchecks | reltriggers | relukeys | relfkeys | relrefs |
relhasoids | relhaspkey | relhasrules | relhassubclass | relacl

----------------------+---------+----------+-------+-------------+----------+-----------+---------------+---------------+-------------+-------------+---------+----------+-----------+-------------+----------+----------+---------+------------+------------+-
------------+----------------+--------

 pg_type              |      71 |        1 |     0 |        1247 |
      2 |
    143 |             0 |             0 | t           | f
| r       |
      17 |         0 |           0 |        0 |        0 |       0
| t

Until that I need to avoid queries with too _few_ resulting rows in psql.
;-) (select * from pg_class works brilliantly).

--
Antti Haapala




Re: psql: \pset pager 'always'?

От
greg@turnstep.com
Дата:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
NotDashEscaped: You need GnuPG to verify this message


> I'm really annoyed by that little 'feature' of psql that decides whether
> to use pager or not. I personally use GNU 'less' with options -S -F as my
> pager, which allows me to scroll vertically AS WELL AS horizontally on
> long input. So a "use pager always"  option with no strange automagic
> behaviour would be nice.

Not a bad idea. Here is a patch that does just that, while maintaining the
"traditional" behavior, so the change should be transparent. Use the
command "\pset pager always" to turn it on. Anything else does the
normal toggle between "on" and "off"


Greg Sabino Mullane greg@turnstep.com
PGP Key: 0x14964AC8 200209111525


Index: command.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/command.c,v
retrieving revision 1.80
diff -c -r1.80 command.c
*** command.c    2002/09/04 20:31:35    1.80
--- command.c    2002/09/11 19:24:41
***************
*** 1867,1877 ****
      /* toggle use of pager */
      else if (strcmp(param, "pager") == 0)
      {
!         popt->topt.pager = !popt->topt.pager;
          if (!quiet)
          {
!             if (popt->topt.pager)
                  puts(gettext("Using pager is on."));
              else
                  puts(gettext("Using pager is off."));
          }
--- 1867,1884 ----
      /* toggle use of pager */
      else if (strcmp(param, "pager") == 0)
      {
!         if (strcasecmp(value, "always") == 0)
!                 popt->topt.pager = 2;
!         else if (popt->topt.pager == 1)
!                 popt->topt.pager = 0;
!         else
!                 popt->topt.pager = 1;
          if (!quiet)
          {
!             if (popt->topt.pager == 1)
                  puts(gettext("Using pager is on."));
+             else if (popt->topt.pager == 2)
+                 puts(gettext("Using pager is always."));
              else
                  puts(gettext("Using pager is off."));
          }
Index: help.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/help.c,v
retrieving revision 1.56
diff -c -r1.56 help.c
*** help.c    2002/09/04 20:31:35    1.56
--- help.c    2002/09/11 19:24:41
***************
*** 159,165 ****
  #endif

  void
! slashUsage(bool pager)
  {
      FILE       *output,
                 *pagerfd = NULL;
--- 159,165 ----
  #endif

  void
! slashUsage(unsigned small int pager)
  {
      FILE       *output,
                 *pagerfd = NULL;
***************
*** 180,186 ****
          struct winsize screen_size;

          result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
!         if (result == -1 || 50 > screen_size.ws_row)
          {
  #endif
              pagerprog = getenv("PAGER");
--- 180,186 ----
          struct winsize screen_size;

          result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
!         if (result == -1 || 50 > screen_size.ws_row || pager == 2)
          {
  #endif
              pagerprog = getenv("PAGER");
Index: help.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/help.h,v
retrieving revision 1.9
diff -c -r1.9 help.h
*** help.h    2002/07/15 01:56:25    1.9
--- help.h    2002/09/11 19:24:41
***************
*** 10,16 ****

  void        usage(void);

! void        slashUsage(bool pager);

  void        helpSQL(const char *topic);

--- 10,16 ----

  void        usage(void);

! void        slashUsage(unsigned small int pager);

  void        helpSQL(const char *topic);

Index: print.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.c,v
retrieving revision 1.31
diff -c -r1.31 print.c
*** print.c    2002/09/01 23:30:46    1.31
--- print.c    2002/09/11 19:24:41
***************
*** 1022,1028 ****
                  lines++;

          result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
!         if (result == -1 || lines > screen_size.ws_row)
          {
  #endif
              pagerprog = getenv("PAGER");
--- 1022,1028 ----
                  lines++;

          result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
!         if (result == -1 || lines > screen_size.ws_row || opt->pager == 2)
          {
  #endif
              pagerprog = getenv("PAGER");
Index: print.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.h,v
retrieving revision 1.14
diff -c -r1.14 print.h
*** print.h    2002/09/04 20:31:36    1.14
--- print.h    2002/09/11 19:24:41
***************
*** 26,33 ****
      enum printFormat format;    /* one of the above */
      bool        expanded;        /* expanded/vertical output (if supported
                                   * by output format) */
!     bool        pager;            /* use pager for output (if to stdout and
!                                  * stdout is a tty) */
      bool        tuples_only;    /* don't output headers, row counts, etc. */
      unsigned short int border;    /* Print a border around the table.
                                   * 0=none, 1=dividing lines, 2=full */
--- 26,34 ----
      enum printFormat format;    /* one of the above */
      bool        expanded;        /* expanded/vertical output (if supported
                                   * by output format) */
!     unsigned short int pager;    /* use pager for output (if to stdout and
!                                  * stdout is a tty)
!                                   * 0=off 1=on 2=always */
      bool        tuples_only;    /* don't output headers, row counts, etc. */
      unsigned short int border;    /* Print a border around the table.
                                   * 0=none, 1=dividing lines, 2=full */
Index: startup.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/startup.c,v
retrieving revision 1.66
diff -c -r1.66 startup.c
*** startup.c    2002/09/06 02:33:47    1.66
--- startup.c    2002/09/11 19:24:41
***************
*** 137,143 ****
      pset.popt.topt.format = PRINT_ALIGNED;
      pset.queryFout = stdout;
      pset.popt.topt.border = 1;
!     pset.popt.topt.pager = true;
      pset.popt.default_footer = true;

      SetVariable(pset.vars, "VERSION", PG_VERSION_STR);
--- 137,143 ----
      pset.popt.topt.format = PRINT_ALIGNED;
      pset.queryFout = stdout;
      pset.popt.topt.border = 1;
!     pset.popt.topt.pager = 1;
      pset.popt.default_footer = true;

      SetVariable(pset.vars, "VERSION", PG_VERSION_STR);

-----BEGIN PGP SIGNATURE-----
Comment: http://www.turnstep.com/pgp.html

iD8DBQE9f5klvJuQZxSWSsgRAuFGAJwNsHiudvGq+Xq8WpQO4bSrd+QUtwCgo1lB
iolPoprltuDfsb4YSjAHHs4=
=5Kt2
-----END PGP SIGNATURE-----



Re: psql: \pset pager 'always'?

От
Bruce Momjian
Дата:
This has been saved for the 7.4 release:

    http://candle.pha.pa.us/cgi-bin/pgpatches2

---------------------------------------------------------------------------

greg@turnstep.com wrote:
[ There is text before PGP section. ]
>
[ PGP not available, raw data follows ]
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> NotDashEscaped: You need GnuPG to verify this message
>
>
> > I'm really annoyed by that little 'feature' of psql that decides whether
> > to use pager or not. I personally use GNU 'less' with options -S -F as my
> > pager, which allows me to scroll vertically AS WELL AS horizontally on
> > long input. So a "use pager always"  option with no strange automagic
> > behaviour would be nice.
>
> Not a bad idea. Here is a patch that does just that, while maintaining the
> "traditional" behavior, so the change should be transparent. Use the
> command "\pset pager always" to turn it on. Anything else does the
> normal toggle between "on" and "off"
>
>
> Greg Sabino Mullane greg@turnstep.com
> PGP Key: 0x14964AC8 200209111525
>
>
> Index: command.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/command.c,v
> retrieving revision 1.80
> diff -c -r1.80 command.c
> *** command.c    2002/09/04 20:31:35    1.80
> --- command.c    2002/09/11 19:24:41
> ***************
> *** 1867,1877 ****
>       /* toggle use of pager */
>       else if (strcmp(param, "pager") == 0)
>       {
> !         popt->topt.pager = !popt->topt.pager;
>           if (!quiet)
>           {
> !             if (popt->topt.pager)
>                   puts(gettext("Using pager is on."));
>               else
>                   puts(gettext("Using pager is off."));
>           }
> --- 1867,1884 ----
>       /* toggle use of pager */
>       else if (strcmp(param, "pager") == 0)
>       {
> !         if (strcasecmp(value, "always") == 0)
> !                 popt->topt.pager = 2;
> !         else if (popt->topt.pager == 1)
> !                 popt->topt.pager = 0;
> !         else
> !                 popt->topt.pager = 1;
>           if (!quiet)
>           {
> !             if (popt->topt.pager == 1)
>                   puts(gettext("Using pager is on."));
> +             else if (popt->topt.pager == 2)
> +                 puts(gettext("Using pager is always."));
>               else
>                   puts(gettext("Using pager is off."));
>           }
> Index: help.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/help.c,v
> retrieving revision 1.56
> diff -c -r1.56 help.c
> *** help.c    2002/09/04 20:31:35    1.56
> --- help.c    2002/09/11 19:24:41
> ***************
> *** 159,165 ****
>   #endif
>
>   void
> ! slashUsage(bool pager)
>   {
>       FILE       *output,
>                  *pagerfd = NULL;
> --- 159,165 ----
>   #endif
>
>   void
> ! slashUsage(unsigned small int pager)
>   {
>       FILE       *output,
>                  *pagerfd = NULL;
> ***************
> *** 180,186 ****
>           struct winsize screen_size;
>
>           result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
> !         if (result == -1 || 50 > screen_size.ws_row)
>           {
>   #endif
>               pagerprog = getenv("PAGER");
> --- 180,186 ----
>           struct winsize screen_size;
>
>           result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
> !         if (result == -1 || 50 > screen_size.ws_row || pager == 2)
>           {
>   #endif
>               pagerprog = getenv("PAGER");
> Index: help.h
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/help.h,v
> retrieving revision 1.9
> diff -c -r1.9 help.h
> *** help.h    2002/07/15 01:56:25    1.9
> --- help.h    2002/09/11 19:24:41
> ***************
> *** 10,16 ****
>
>   void        usage(void);
>
> ! void        slashUsage(bool pager);
>
>   void        helpSQL(const char *topic);
>
> --- 10,16 ----
>
>   void        usage(void);
>
> ! void        slashUsage(unsigned small int pager);
>
>   void        helpSQL(const char *topic);
>
> Index: print.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.c,v
> retrieving revision 1.31
> diff -c -r1.31 print.c
> *** print.c    2002/09/01 23:30:46    1.31
> --- print.c    2002/09/11 19:24:41
> ***************
> *** 1022,1028 ****
>                   lines++;
>
>           result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
> !         if (result == -1 || lines > screen_size.ws_row)
>           {
>   #endif
>               pagerprog = getenv("PAGER");
> --- 1022,1028 ----
>                   lines++;
>
>           result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
> !         if (result == -1 || lines > screen_size.ws_row || opt->pager == 2)
>           {
>   #endif
>               pagerprog = getenv("PAGER");
> Index: print.h
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.h,v
> retrieving revision 1.14
> diff -c -r1.14 print.h
> *** print.h    2002/09/04 20:31:36    1.14
> --- print.h    2002/09/11 19:24:41
> ***************
> *** 26,33 ****
>       enum printFormat format;    /* one of the above */
>       bool        expanded;        /* expanded/vertical output (if supported
>                                    * by output format) */
> !     bool        pager;            /* use pager for output (if to stdout and
> !                                  * stdout is a tty) */
>       bool        tuples_only;    /* don't output headers, row counts, etc. */
>       unsigned short int border;    /* Print a border around the table.
>                                    * 0=none, 1=dividing lines, 2=full */
> --- 26,34 ----
>       enum printFormat format;    /* one of the above */
>       bool        expanded;        /* expanded/vertical output (if supported
>                                    * by output format) */
> !     unsigned short int pager;    /* use pager for output (if to stdout and
> !                                  * stdout is a tty)
> !                                   * 0=off 1=on 2=always */
>       bool        tuples_only;    /* don't output headers, row counts, etc. */
>       unsigned short int border;    /* Print a border around the table.
>                                    * 0=none, 1=dividing lines, 2=full */
> Index: startup.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/startup.c,v
> retrieving revision 1.66
> diff -c -r1.66 startup.c
> *** startup.c    2002/09/06 02:33:47    1.66
> --- startup.c    2002/09/11 19:24:41
> ***************
> *** 137,143 ****
>       pset.popt.topt.format = PRINT_ALIGNED;
>       pset.queryFout = stdout;
>       pset.popt.topt.border = 1;
> !     pset.popt.topt.pager = true;
>       pset.popt.default_footer = true;
>
>       SetVariable(pset.vars, "VERSION", PG_VERSION_STR);
> --- 137,143 ----
>       pset.popt.topt.format = PRINT_ALIGNED;
>       pset.queryFout = stdout;
>       pset.popt.topt.border = 1;
> !     pset.popt.topt.pager = 1;
>       pset.popt.default_footer = true;
>
>       SetVariable(pset.vars, "VERSION", PG_VERSION_STR);
>
> -----BEGIN PGP SIGNATURE-----
> Comment: http://www.turnstep.com/pgp.html
>
> iD8DBQE9f5klvJuQZxSWSsgRAuFGAJwNsHiudvGq+Xq8WpQO4bSrd+QUtwCgo1lB
> iolPoprltuDfsb4YSjAHHs4=
> =5Kt2
> -----END PGP SIGNATURE-----
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org
>
[ Decrypting message... End of raw data. ]

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: psql: \pset pager 'always'?

От
Justin Hawkins
Дата:
antti.haapala@iki.fi (Antti Haapala) writes:

> I don't know if this is already done, but...
>
> I'm really annoyed by that little 'feature' of psql that decides whether
> to use pager or not. I personally use GNU 'less' with options -S -F as my
> pager, which allows me to scroll vertically AS WELL AS horizontally on
> long input. So a "use pager always"  option with no strange automagic
> behaviour would be nice. Or do you consider this being readable (copyed
> verbatim from terminal window):

Yes, I'd like to second that.

My ugly workaround when I need to have less invoked (so I can scroll
sideways) and the result set it small (in rows), I make my window very
small (vertically), run the query, then stretch it out again.

        - Justin

--
Justin Hawkins
Internode Professional Access

Re: psql: \pset pager 'always'?

От
Martijn van Oosterhout
Дата:
On Thu, Sep 12, 2002 at 10:20:45AM +0930, Justin Hawkins wrote:
> antti.haapala@iki.fi (Antti Haapala) writes:
>
> > I don't know if this is already done, but...
> >
> > I'm really annoyed by that little 'feature' of psql that decides whether
> > to use pager or not. I personally use GNU 'less' with options -S -F as my
> > pager, which allows me to scroll vertically AS WELL AS horizontally on
> > long input. So a "use pager always"  option with no strange automagic
> > behaviour would be nice. Or do you consider this being readable (copyed
> > verbatim from terminal window):
>
> Yes, I'd like to second that.
>
> My ugly workaround when I need to have less invoked (so I can scroll
> sideways) and the result set it small (in rows), I make my window very
> small (vertically), run the query, then stretch it out again.

Remember, you can always use \g like this:

select * from table \g |less -S

Maybe not neat, but very effective.
--
Martijn van Oosterhout   <kleptog@svana.org>   http://svana.org/kleptog/
> There are 10 kinds of people in the world, those that can do binary
> arithmetic and those that can't.

Re: psql: \pset pager 'always'?

От
Bruce Momjian
Дата:
Can someone supply a patch to automatically invoke the pager if the
output width is greater than the screen?  We already test for screen
rows but not for screen width.

---------------------------------------------------------------------------

Martijn van Oosterhout wrote:
> On Thu, Sep 12, 2002 at 10:20:45AM +0930, Justin Hawkins wrote:
> > antti.haapala@iki.fi (Antti Haapala) writes:
> >
> > > I don't know if this is already done, but...
> > >
> > > I'm really annoyed by that little 'feature' of psql that decides whether
> > > to use pager or not. I personally use GNU 'less' with options -S -F as my
> > > pager, which allows me to scroll vertically AS WELL AS horizontally on
> > > long input. So a "use pager always"  option with no strange automagic
> > > behaviour would be nice. Or do you consider this being readable (copyed
> > > verbatim from terminal window):
> >
> > Yes, I'd like to second that.
> >
> > My ugly workaround when I need to have less invoked (so I can scroll
> > sideways) and the result set it small (in rows), I make my window very
> > small (vertically), run the query, then stretch it out again.
>
> Remember, you can always use \g like this:
>
> select * from table \g |less -S
>
> Maybe not neat, but very effective.
> --
> Martijn van Oosterhout   <kleptog@svana.org>   http://svana.org/kleptog/
> > There are 10 kinds of people in the world, those that can do binary
> > arithmetic and those that can't.
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: psql: \pset pager 'always'?

От
greg@turnstep.com
Дата:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


> Can someone supply a patch to automatically invoke the pager if the
> output width is greater than the screen?  We already test for screen
> rows but not for screen width.

Easily done, but I am not sure that this is the right thing to do.
A pager is designed to handle excess vertical input, but not all
can handle excess horizontal input (the width). I suspect that doing
so would not be a good idea for the same reason given to me when I
asked "why not send everything to the pager?": some systems force you
to specifically exit the pager; this can be real annoying for cases
with small input.

Greg Sabino Mullane greg@turnstep.com
PGP Key: 0x14964AC8 200209180926


-----BEGIN PGP SIGNATURE-----

iD8DBQE9iID8vJuQZxSWSsgRAk2mAKDRRopF9H7PMW18+qq5WgPHRiga/QCcCG2e
G/ZxYw5fqwGxov9hVd+mhV0=
=9nqS
-----END PGP SIGNATURE-----



Re: psql: \pset pager 'always'?

От
Martijn van Oosterhout
Дата:
On Wed, Sep 18, 2002 at 01:40:42PM -0000, greg@turnstep.com wrote:
>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
>
> > Can someone supply a patch to automatically invoke the pager if the
> > output width is greater than the screen?  We already test for screen
> > rows but not for screen width.
>
> Easily done, but I am not sure that this is the right thing to do.
> A pager is designed to handle excess vertical input, but not all
> can handle excess horizontal input (the width). I suspect that doing
> so would not be a good idea for the same reason given to me when I
> asked "why not send everything to the pager?": some systems force you
> to specifically exit the pager; this can be real annoying for cases
> with small input.

While this is true, if you do a select whose output wraps because it is too
wide, getting it to go through "less -S" is extremely useful to have the
columns line up. OTOH, sending everything to the pager is annoying if the
result is only one value.

I'd be happy with an easier way to force the pager than "\g |less -S".
Perhaps if \g is specified without a filename, it defaults to the pager.
Would such a patch be accepted?

--
Martijn van Oosterhout   <kleptog@svana.org>   http://svana.org/kleptog/
> There are 10 kinds of people in the world, those that can do binary
> arithmetic and those that can't.

Re: psql: \pset pager 'always'?

От
Bruce Momjian
Дата:
There is a patch at:

    http://candle.pha.pa.us/cgi-bin/pgpatches2

which will allow you to turn on the pager always.  This is for 7.4.


---------------------------------------------------------------------------

Martijn van Oosterhout wrote:
> On Wed, Sep 18, 2002 at 01:40:42PM -0000, greg@turnstep.com wrote:
> >
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> >
> > > Can someone supply a patch to automatically invoke the pager if the
> > > output width is greater than the screen?  We already test for screen
> > > rows but not for screen width.
> >
> > Easily done, but I am not sure that this is the right thing to do.
> > A pager is designed to handle excess vertical input, but not all
> > can handle excess horizontal input (the width). I suspect that doing
> > so would not be a good idea for the same reason given to me when I
> > asked "why not send everything to the pager?": some systems force you
> > to specifically exit the pager; this can be real annoying for cases
> > with small input.
>
> While this is true, if you do a select whose output wraps because it is too
> wide, getting it to go through "less -S" is extremely useful to have the
> columns line up. OTOH, sending everything to the pager is annoying if the
> result is only one value.
>
> I'd be happy with an easier way to force the pager than "\g |less -S".
> Perhaps if \g is specified without a filename, it defaults to the pager.
> Would such a patch be accepted?
>
> --
> Martijn van Oosterhout   <kleptog@svana.org>   http://svana.org/kleptog/
> > There are 10 kinds of people in the world, those that can do binary
> > arithmetic and those that can't.
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073