[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: a function to enter string
From: |
Pascal Bourguignon |
Subject: |
Re: a function to enter string |
Date: |
Tue, 20 Feb 2007 00:28:18 +0100 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.0.91 (gnu/linux) |
Gary Wessle <phddas@yahoo.com> writes:
> Hi
>
> I have this key macro in my emacs which puts "#include <string>" in
> the first blank line in the buffer, also another key macro which puts
> the string "std::string" at the point.
>
> (fset 'str
> [?\M-<?\M-} ?# ?i ?n ?c ?l ?u ?d ?e ? ?< ?s ?t ?r ?i ?n ?g ?>
> return])
>
> (fset ':s
> "std::string")
>
> I want when I type M-x :s which is the second key macro above, it
> puts the string "std::string" at point as well as checks to see if
> "#include <string>" is at the top of the buffer, if not it inserts
> it so that I don't have to do it.
>
> how can this be done?
I would write a command, like:
(defun std-string ()
(interactive)
(insert "std::string")
(save-excursion
(beginning-of-buffer)
(unless (re-search-forward "#include <string>" nil t)
;; it is silly to search the first white line to insert
;; the #include, but that's what you asked...
;; It would be better to just skip over then title comment,
;; and to _insert_ a new line for the #include.
;;
(if (re-search-forward "^[ \t]*$" nil t)
(progn
(beginning-of-line)
(insert "#include <string>"))
(progn
;; See how it's ludicruous? What should we do
;; when there's no empty line???
(end-of-buffer)
(insert "\n#include <string>"))))))
The symbols whose name starts with a colon are special. They get
automatically bound to themselves. So we can evaluate :xyz instead of
':xyz when we want :xyz. We call them keywords, since they're often
used as "syntax" keywords. While it's possible to use them to name
functions (given that emacs lisp is a "lisp-2", meaning that a symbol
can be bound to a value and to a function at the same time), I
wouldn't advise to bind functions (or even key macro) to keywords.
You can invoke such a command with M-x stdstr RET and if it's too much
to type, you can bind the command to some key sequence. For example,
to bind it to the sequence F8 s you can put the following in your
~/.emacs :
(defun c++-meat ()
(local-set-key (kbd "<f8> s") 'std-string)
;; ...
)
(add-hook 'c++-mode-hook 'c++-meat)
--
__Pascal Bourguignon__ http://www.informatimago.com/
ATTENTION: Despite any other listing of product contents found
herein, the consumer is advised that, in actuality, this product
consists of 99.9999999999% empty space.