Question

Question:

Comment puis-je créer des raccourcis clavier personnalisés pour les modes mineurs? Quelque chose comme ça .

Voici ce que j'ai jusqu'à présent. J'essaie d'obtenir juste un raccourci clavier personnalisé au travail:

(define-minor-mode num-mode
       "Toggle the Num pad keys.
     With no argument, this command toggles the mode.
     Non-null prefix argument turns on the mode.
     Null prefix argument turns off the mode.

     When Num mode is enabled, the num pad inserts the
     keys you see on the pad. This may over ried existing
     definitions, and is probably only usefule if you aref
     running Emacs through a terminal."
      ;; The initial value.
      nil
      ;; The indicator for the mode line.
      " NumPad"
      ;; The minor mode bindings.
      ;; This doesn't work right now!!!!
       '(((kbd "<kp-1>") . "a"))
      :global 1
)

Quand je frappe « 1 » sur le pavé numérique après avoir appelé mon mode mineur personnalisé, « mode num- » et de vérifier qu'il est dans le mini-tampon, je reçois le <kp-1> is undefined d'erreur. Ce que je veux arriver est a est imprimé où le pointeur est quand je frappe <kp-1>. (Juste un test)

Contexte:

Alors, je l'habitude d'utiliser mon pavé numérique pour vous déplacer entre les tampons (les touches fléchées me déplacer les directions appropriées). Il est fixé au niveau mondial. Je veux créer un mode mineur que je peux appeler quand je veux utiliser mon clavier numérique pour saisir simplement les chiffres.

Par défaut, les touches de mon num-pad ne sont pas définies. J'utilise <kp-0> à <kp-9> pour définir les raccourcis clavier pour les touches du pavé numérique.

Je peux créer un mode mineur que je peux appeler, mais je ne peux pas joindre tous les raccourcis clavier. Cela est vrai pour tous les raccourcis clavier, y compris un non défini nulle part ailleurs.

Merci pour toute aide!

Était-ce utile?

La solution

Réponse courte

ligne Problème:

'(((kbd "<kp-1>") . "a"))

Solution (force l'évaluation de la macro):

;; Single quote changed to back-quote and added a comma
`((,(kbd "<kp-1>") . "a"))

Réponse longue

définir mineur mode macro vous permet de créer des modes mineurs relativement facilement (dans la mesure Emacs) va.

D'abord, je vais vous montrer comment il est fait, alors je vais vous expliquer comment cela fonctionne:

En forme générale:

(define-minor-mode NAME-mode
  "DOCUMENTATION"
  INIT-VALUE
  "LIGHTER"
  ;; keymap
  '(
    (KEY-SEQUENCE . DEFINITION)
    (KEY-SEQUENCE . DEFINITION)
    ... ETC ...
   )
  ;; other options
  :KEYWORD-ARG VALUE
  :KEYWORD-ARG VALUE
  ... ETC ...       
)

Exemple spécifique à l'évaluation forcée des macros dans le alist:

;; Custom Minor Mode
(define-minor-mode custom-mode
  "Doc description, yada yada yada."
  ;; The initial value - Set to 1 to enable by default
  nil
  ;; The indicator for the mode line.
  " CustomMode"
  ;; The minor mode keymap
  `(
    (,(kbd "C-c C-a") . some-command)
    (,(kbd "C-c C-b") . other-command)
    ("\C-c\C-c" . "This works too")
   )
   ;; Make mode global rather than buffer local
   :global 1
)

Une autre façon, si vous souhaitez utiliser une variable pour le keymap est de définir la variable keymap et la keymap avant la déclaration en mode mineur quelque chose comme ceci:

(defvar custom-mode-keymap (make-keymap) "num-mode keymap.")
(define-key custom-mode-keymap (kbd "C-c C-a") 'some-command)

Et puis, dans la définition du mode mineur, simple liste le nom de la variable pour votre keymap, au lieu du alist

(define-key custom-mode-keymap (kbd "C-c C-b") 'other-command)
;; Num pad enable
(define-minor-mode custom-mode
...

      ;; The minor mode bindings.
      custom-mode-keymap

Comment tout cela fonctionne

De haut en bas, à droite définissent le mode mineur-après, nous définissons un nom de commande pour faire basculer le mode mineur. custom-mode dans ce cas (M-x custom-mode pour faire basculer le mode). Ceci définit également une variable du même nom.

Juste après le nom de la commande, nous énumérons la chaîne de documentation pour le mode mineur entre guillemets. Cela peut être à peu près aussi longtemps que vous le souhaitez.

Ensuite, nous avons plusieurs choix. Le choix le plus simple est de simplement énumérer trois choses, puis toutes les autres options. Les trois choses doivent être énumérés dans l'ordre ci-dessous. Ces trois choses sont:

  1. La valeur initilization pour la variable mode mineur. nil aura le mode désactivé par défaut. Autre chose que nil l'aura par défaut.

  2. Le briquet. Le briquet est tout simplement ce qui est l'affichage dans la ligne de mode en bas lorsque le mode mineur est activé. Cela devrait être court, et il va souvent de l'aide, en termes de mise en forme, pour commencer par un espace.

  3. Le keymap. Le plan de codage peut être soit définie comme une variable ou une alist (liste d'association). Depuis l'utilisation d'un alist est plus simple et plus courte, c'est ce que j'ai utilisé dans l'exemple. Le alist devrait être sous la forme (key-sequence . definition).

Si vous définissez le keymap comme alist, il y a quelques petites choses à surveiller, surtout si vous êtes habitué à la définition de raccourcis clavier globaux. Tout d'abord, les noms de commandes ne sont pas cités. Deuxièmement, si vous souhaitez utiliser une macro, vous devez le forcer à évaluer ( et SO ) . Cela se fait avec une combinaison de l'arrière-citation (non unique citation) et la virgule. Vous pouvez voir comment cela se fait dans l'exemple avec la macro kbd. J'ai aussi inclus une définition combinaison de touches si vous n'utilisez pas la macro kbd. Si vous citez simplement une chaîne dans votre keymap, qui imprimeront lorsque la combinaison de touches définie est pressée (comme pour définir les raccourcis clavier globaux).

Le keymap ne fonctionnera pas avec les macros kbd si vous ne forcez pas l'évaluation des macros kbd avec une combinaison de la citation de retour et la virgule comme ceci:.

`((,(kbd "C-c C-a") . some-command))

Enfin, vous pouvez ajouter des options supplémentaires à l'aide de mots clés-args de la forme :blah. Dans l'exemple je :global. Nous aurions pu définir le mode entier avec mot-clé args, mais il est plus courte à la liste juste la valeur initiale, plus léger et keymap dans l'ordre.

Autres conseils

Vous devez avoir un code comme celui-ci dans votre mode mineur définition:

(defvar your-mode-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map parent-mode-shared-map)
    (define-key map "\C-c\C-a" 'some-defun)
    (define-key map "\C-c\C-b" 'some-other-sexp)
    map)

(use-local-map your-mode-map)

Vous pourriez avoir un regard sur les nombreux modes disponibles dans EmacsWiki pour référence.

Jetez un oeil à cette (juste pour des informations sur les raccourcis clavier):

http: // www .gnu.org / logiciel / emacs / manuel / html_node / emacs / Key-Bindings.html # Key- Manchettes

http: // www .gnu.org / logiciel / emacs / manuel / html_node / emacs / local-Keymaps.html local #-Keymaps

De http://xahlee.org/emacs/reclaim_keybindings.html :

modes majeurs bien écrits courront crochet à la fin. Ainsi, vous pouvez utiliser un crochet pour définir votre raccourci clavier. modes mineurs ne disposent généralement pas des crochets. Dans ce cas, vous pouvez appeler « (besoin ) », puis définir votre raccourci clavier.

Aussi, vous pouvez jeter un oeil à: http://www.cs.utah.edu/ Département / vieux / texinfo / emacs19 / emacs_35.html # SEC347

Peut-être la réponse acceptée vous aide aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top