Function: context-menu-region

context-menu-region is a byte-compiled function defined in mouse.el.gz.

Signature

(context-menu-region MENU CLICK)

Documentation

Populate MENU with region commands.

This function has :around advice: context-menu-region@magit-section-mode.

Source Code

;; Defined in /usr/src/emacs/lisp/mouse.el.gz
(defun context-menu-region (menu click)
  "Populate MENU with region commands."
  (define-key-after menu [separator-region] menu-bar-separator)
  (when (and mark-active (not buffer-read-only))
    (define-key-after menu [cut]
      '(menu-item "Cut" kill-region
                  :help
                  "Cut (kill) text in region between mark and current position")))
  (when mark-active
    (define-key-after menu [copy]
      ;; ns-win.el said: Substitute a Copy function that works better
      ;; under X (for GNUstep).
      `(menu-item "Copy" ,(if (featurep 'ns)
                              'ns-copy-including-secondary
                            'kill-ring-save)
                  :help "Copy text in region between mark and current position"
                  :keys ,(if (featurep 'ns)
                             "\\[ns-copy-including-secondary]"
                           "\\[kill-ring-save]"))))
  (when (and (or (gui-backend-selection-exists-p 'CLIPBOARD)
                 (if (featurep 'ns) ; like paste-from-menu
                     (cdr yank-menu)
                   kill-ring))
             (not buffer-read-only))
    (define-key-after menu [paste]
      `(menu-item "Paste" mouse-yank-at-click
                  :help "Paste (yank) text most recently cut/copied")))
  (when (and (cdr yank-menu) (not buffer-read-only))
    (let ((submenu (make-sparse-keymap (propertize "Paste from Kill Menu")))
          (i 0))
      (dolist (item (reverse yank-menu))
        (when (consp item)
          (define-key submenu
            (vector (intern (format "kill-%d" (setq i (1+ i)))))
            `(menu-item ,(cadr item)
                        ,(lambda () (interactive)
                           (mouse-yank-from-menu click (car item)))))))
      (define-key-after menu (if (featurep 'ns) [select-paste] [paste-from-menu])
        `(menu-item ,(if (featurep 'ns) "Select and Paste" "Paste from Kill Menu")
                    ,submenu
                    :help "Choose a string from the kill ring and paste it"))))
  (when (and mark-active (not buffer-read-only))
    (define-key-after menu [clear]
      '(menu-item "Clear" delete-active-region
                  :help
                  "Delete text in region between mark and current position")))

  (let ((submenu (make-sparse-keymap (propertize "Select"))))
    (define-key-after submenu [mark-whole-buffer]
      `(menu-item "All"
                  ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'buffer))
                  :help "Mark the whole buffer for a subsequent cut/copy"))
    (with-current-buffer (window-buffer (posn-window (event-end click)))
      (when (let* ((pos (posn-point (event-end click)))
                   (char (when pos (char-after pos))))
              (or (and char (eq (syntax-class-to-char
                                 (syntax-class (syntax-after pos)))
                                ?\"))
                  (nth 3 (save-excursion (syntax-ppss pos)))))
        (define-key-after submenu [mark-string]
          `(menu-item "String"
                      ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'string))
                      :help "Mark the string at click for a subsequent cut/copy"))))
    (define-key-after submenu [mark-line]
      `(menu-item "Line"
                  ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'line))
                  :help "Mark the line at click for a subsequent cut/copy"))
    (when (region-active-p)
      (define-key-after submenu [mark-none]
        `(menu-item "None"
                    ,(lambda (_e) (interactive "e") (deactivate-mark))
                    :help "Deactivate the region")))

    (define-key-after menu [select-region]
      `(menu-item "Select" ,submenu)))
  menu)