[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Generalize and standarize dired-plural-s

From: Kaushal Modi
Subject: Re: Generalize and standarize dired-plural-s
Date: Sun, 18 Sep 2016 15:06:26 +0000

On Sun, Sep 18, 2016, 10:00 AM Tino Calancha <address@hidden> wrote:


dired.el introduces the function `dired-plural-s' to pluralize
correctly output messages as:
(format "Kill Dired buffer%s of %s, too? "
         (dired-plural-s (length buf-list))
         (file-name-nondirectory fn))

In this example, it returns "s" if (length buf-list) > 1.  Otherwise,
it returns "".
Of course, this task is not exclusive of Dired: many other packages
in Emacs source code do the same thing.

I agree. I have also had something in my emacs config that made me wish of the existence of a function like this.
As you know, for some words the plural is different that just
appending "s" to the end.  For instance, in message.el:
  "Really use %s possibly unknown group%s: %s? "
  (if (= (length errors) 1) "this" "these")
  (if (= (length errors) 1) "" "s")
  (mapconcat 'identity errors ", "))

"this" -> "these" is not handled by `dired-plural-s'.

I am wondering if it has sense to add a standard function,
`string-plural-s', covering both cases: I), II). 

Then, we might do
`dired-plural-s' and alias for the new function.
We might update all the 'plularizations' in Emacs source code to use
the new function as well.

Following function could do the job:

(defun string-plural-s (arg &optional string plural)
Return plural of STRING if ARG is nil, or an integer >1, or a seq of
length >1.
If ARG is =1 or a sequence of length =1, return STRING.
Optional arg PLURAL is the plural of STRING.
If STRING is nil, return \"s\" or \"\"."
   (let ((single (or string ""))
         (plural (if (and string plural) plural
                   (apply #'string (append string "s" nil)))))
     (cond ((natnump arg)
            (if (= arg 1) single plural))
           ((null arg) plural)
           ((consp arg)
            (if (null (cdr arg)) single plural))
           ((arrayp arg)
            (if (= (length arg) 1) single plural))
            (signal 'wrong-type-argument
                    (list arg 'natnump 'listp 'arrayp)))))) 

What do you think about this idea?

I like this idea. 

The only comment I have is that the "append 's' to pluralize" part should not be hard-coded into the string-plural-s function.

How about have a "string-plural--conditions-function" variable (or something named like that), and then you funcall that variable in string-plural-s?

The "string-plural--conditions-function" variable would be a lambda function that would accept an arg STRING and output a plural string for that STRING.

Inside the lambda, would be an elaborate cond form that would decide how to pluralize the string

this -> these
grape -> grapes
knife -> knives
ruby -> rubies
sheep -> sheep

This  "string-plural--conditions-function" variable will be quite an elaborate cond form as it would try to cover all the corner cases of English pluralization. I am suggesting this to be a separate function so that the logic of string-plural-s stays clear and succinct and the English grammar rules do not come in the way while understanding that function.


Kaushal Modi

reply via email to

[Prev in Thread] Current Thread [Next in Thread]