From: Andreas Politz <politza@fh-trier.de>
To: help-gnu-emacs@gnu.org
Subject: Re: elisp exercise: toggle-letter-case
Date: Sat, 18 Oct 2008 01:29:36 +0200 [thread overview]
Message-ID: <1224286525.260548@arno.fh-trier.de> (raw)
In-Reply-To: <420ba543-19ba-4987-9f3a-a57878777c9d@n33g2000pri.googlegroups.com>
Xah wrote:
> here's a little interesting exercise.
>
> I'm writing a toggle-letter-case function below. However, it has some
> problems. (see the doc string). After thinking on this for a while,
> the problem seems a bit complex. It'll take perhaps few hours to fix
> these, in particular, if it is to cover chars like éÉ èÈ üÜ. Also, it
> seems a good solution will require this function to have a state, but
> i'm reluctant to introduce a global variable for it.
>
> I'm wondering, if anyone have a better solution?
>
> (defun toggle-letter-case ()
> "Toggle the letter case of current word or text selection.
> Toggles from 3 cases: upper case, lower case, title case,
> in that order.
> Title case means upcase first letter of each word.
>
> Todo:
> • this command only consider English alphabets. For example, it may
> not work properly if you have éÉ èÈ üÜ.
> • It may not work when the first or second letter is a number, e.g.
> “1time”.
> • It may not work when you only have a single letter. e.g. “A
> teapot”."
> (interactive)
>
> (save-excursion
> (let (pt pos1 pos2 cap1p cap2p (deactivate-mark nil) (case-fold-search
> nil)
> )
> (setq pt (point))
> (if (and transient-mark-mode mark-active)
> (setq pos1 (region-beginning)
> pos2 (region-end))
> (setq pos1 (car (bounds-of-thing-at-point 'word))
> pos2 (cdr (bounds-of-thing-at-point 'word))))
>
> ;; check 1th and 2th letters cases
> (goto-char pos1)
> (setq cap1p (looking-at "[A-Z]"))
> (goto-char (1+ pos1))
> (setq cap2p (looking-at "[A-Z]"))
>
> (cond
> ((and (not cap1p) (not cap2p)) (upcase-initials-region pos1 pos2))
> ((and cap1p (not cap2p)) (upcase-region pos1 pos2) )
> ((and cap1p cap2p) (downcase-region pos1 pos2) )
> (t (downcase-region pos1 pos2) )
> )
> )
> )
> )
>
> PS the above assumes you have transient-mode on.
>
> Xah
> ∑ http://xahlee.org/
>
> ☄
Giving the command a state makes it so much easier, because you
don't have to look at the text at all. Unless you want it to
consider the current textstate.
Anyway, here is how I would do it:
(defun up/down/camel-case (&optional start end)
(interactive (if (and transient-mark-mode mark-active)
(list (region-beginning)
(region-end))))
(if (not (eq last-command this-command))
(put this-command 'call-count 0))
(let* ((mark (and transient-mark-mode mark-active))
(call-count (get this-command 'call-count))
deactivate-mark
(action
(nth call-count
(if mark
'(downcase-region upcase-region capitalize-region)
'(downcase-word upcase-word capitalize-word)))))
(if mark
(apply action (list start end))
(funcall action 1)
(backward-word))
(put this-command 'call-count (% (1+ call-count) 3))))
-ap
next prev parent reply other threads:[~2008-10-17 23:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-17 21:02 elisp exercise: toggle-letter-case Xah
2008-10-17 23:29 ` Andreas Politz [this message]
2008-10-18 1:06 ` Nikolaj Schumacher
[not found] ` <mailman.1411.1224291972.25473.help-gnu-emacs@gnu.org>
2008-10-18 18:53 ` Xah
2008-10-18 20:47 ` Nikolaj Schumacher
2008-10-18 20:50 ` Xah
2008-10-19 15:26 ` Nikolaj Schumacher
[not found] ` <mailman.1506.1224429976.25473.help-gnu-emacs@gnu.org>
2008-10-19 17:46 ` Xah
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1224286525.260548@arno.fh-trier.de \
--to=politza@fh-trier.de \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.