GNU Info

Info Node: (emacs-lisp-intro.info)Complete kill-region

(emacs-lisp-intro.info)Complete kill-region


Next: condition-case Prev: kill-region Up: kill-region
Enter node , (file) or (file)node

The Complete `kill-region' Definition
-------------------------------------

   We will go through the `condition-case' code in a moment.  First,
let us look at the complete definition of `kill-region', with comments
added:

     (defun kill-region (beg end)
       "Kill between point and mark.
     The text is deleted but saved in the kill ring."
       (interactive "r")
     
       ;; 1. `condition-case' takes three arguments.
       ;;    If the first argument is nil, as it is here,
       ;;    information about the error signal is not
       ;;    stored for use by another function.
       (condition-case nil
     
           ;; 2. The second argument to `condition-case'
           ;;    tells the Lisp interpreter what to do when all goes well.
     
           ;;    The `delete-and-extract-region' function usually does the
           ;;    work.  If the beginning and ending of the region are both
           ;;    the same, then the variable `string' will be empty, or nil
           (let ((string (delete-and-extract-region beg end)))
     
             ;; `when' is an `if' clause that cannot take an `else-part'.
             ;; Emacs normally sets the value of `last-command' to the
             ;; previous command.
             ;; `kill-append' concatenates the new string and the old.
             ;; `kill-new' inserts text into a new item in the kill ring.
             (when string
               (if (eq last-command 'kill-region)
                   ;; if true, prepend string
                   (kill-append string (< end beg))
                 (kill-new string)))
             (setq this-command 'kill-region))
     
         ;; 3. The third argument to `condition-case' tells the interpreter
         ;;    what to do with an error.
         ;;    The third argument has a conditions part and a body part.
         ;;    If the conditions are met (in this case,
         ;;             if text or buffer is read-only)
         ;;    then the body is executed.
         ((buffer-read-only text-read-only) ;; this is the if-part
          ;; then...
          (copy-region-as-kill beg end)
          (if kill-read-only-ok            ;; usually this variable is nil
              (message "Read only text copied to kill ring")
            ;; or else, signal an error if the buffer is read-only;
            (barf-if-buffer-read-only)
            ;; and, in any case, signal that the text is read-only.
            (signal 'text-read-only (list (current-buffer)))))))


automatically generated by info2www version 1.2.2.9