None of that worked for me. The last one even does Show All always, with no option.
Here's my solution, which does work for me (commencing at was was line 893, before the GitHub changes noted above) ...
// Retrieve the current number of products per page (either the default, the GET parameter or the one in the cookie)
$this->n = $default_products_per_page;
if ((int)Tools::getValue('n') > 0 || in_array((int)Tools::getValue('n'), $nArray))
$this->n = (int)Tools::getValue('n');
elseif (isset($this->context->cookie->nb_item_per_page) && in_array($this->context->cookie->nb_item_per_page, $nArray))
$this->n = (int)$this->context->cookie->nb_item_per_page;
else {
// Retrieve the page number (either the GET parameter or the first page)
$this->p = (int)Tools::getValue('p', 1);
// If the parameter is not correct then redirect (do not merge with the previous line, the redirect is required in order to avoid duplicate content)
if (!is_numeric($this->p) || $this->p < 1)
Tools::redirect(self::$link->getPaginationLink(false, false, $this->n, false, 1, false));
}
(Sorry about the weird font and colors. I doesn't look horrid like this when I paste the code into the editor.)
This code is a combination of the first solution offered above (which works only on page 1) plus an extra else { ... } wrapper around "Retrieve page number" code, to prevent that happening at all if n is present, since p= seems to override n= in all cases otherwise.
This then, works from page 1 AND pages 2 ... last.