Domanda

Domanda:

Come faccio a creare scorciatoie da tastiera personalizzate per modalità secondarie? Qualcosa di simile .

Ecco quello che ho finora. Sto cercando di ottenere solo una combinazione di tasti personalizzate al lavoro:

(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
)

Quando mi ha colpito "1" sul tastierino numerico dopo aver chiamato il mio modo minore personalizzato, "num-mode" e la verifica è su nel mini tampone, ho l'<kp-1> is undefined errore. Quello che voglio che accada è a viene stampato in cui il puntatore è quando ho colpito <kp-1>. (Solo un test)

Contesto:

Quindi, io di solito uso il mio tastierino numerico per spostarsi tra i buffer (i tasti freccia mi commuovono le istruzioni appropriate). Questo è globalmente. Voglio creare un modo minore che posso chiamare quando voglio usare il mio num-pad per sufficiente inserire i numeri.

Per impostazione predefinita, i tasti sul mio num-pad sono indefiniti. Io uso <kp-0> a <kp-9> per definire le combinazioni di tasti per i tasti del tastierino numerico.

I grado di creare un modo minore che posso chiamare, ma non posso allegare eventuali combinazioni di tasti. Questo è vero per tutte le combinazioni di tasti, di cui una non definita altrove.

Grazie per qualsiasi aiuto!

È stato utile?

Soluzione

risposta breve

linea Problema:

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

Solution (forzare la valutazione della macro):

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

Long risposta

Il definire-minor-mode macro consente di creare modalità secondarie in modo relativamente facile (per quanto riguarda Emacs) va.

Per prima cosa faccio vedere come si fa, poi ti spiego come funziona:

In forma generale:

(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 ...       
)

Esempio specifico con la valutazione forzato di macro nel 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
)

Un modo alternativo, se si desidera utilizzare una variabile per la mappa dei tasti è quello di definire la variabile keymap e la mappa dei tasti prima la dichiarazione di modo minore qualcosa di simile:

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

E poi, nella definizione modo minore, elenco semplice il nome della variabile per la mappa della tastiera, al posto del 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

Come funziona il tutto

Da cima a fondo, subito dopo definire minor-mode si definisce un nome di comando per commutare il modo minore. custom-mode in questo caso (M-x custom-mode per commutare la modalità). Questo definisce anche una variabile dello stesso nome.

Subito dopo il nome del comando, elenchiamo la stringa di documentazione per il modo minore tra virgolette. Questo può essere più o meno il tempo che si desidera.

Avanti abbiamo diverse scelte. La scelta più semplice è quello di elencare semplicemente tre cose e poi le eventuali opzioni aggiuntive. Le tre cose devono essere elencati nell'ordine di seguito. Queste tre cose sono:

  1. Il valore per la variabile initilization modo minore. nil avrà la la modalità di default. Qualcosa di diverso nil lo avrà di default.

  2. L'accendino. L'accendino è semplicemente ciò che è esposizione nella linea di modalità in basso quando il vostro modo minore è acceso. Questo dovrebbe essere breve, e sarà spesso di aiuto, in termini di formattazione, per iniziare con uno spazio.

  3. La mappa di tastiera. La mappa di tastiera può o essere definita come una variabile o un'alist (elenco associazione). Dato che l'utilizzo di un alist è più semplice e più breve, questo è quello che ho usato l'esempio. L'alist dovrebbe essere in forma (key-sequence . definition).

Se si definisce la mappa della tastiera come un alist, ci sono alcune cose da guardare fuori per, soprattutto se si è abituati a definire scorciatoie da tastiera globali. In primo luogo, i nomi dei comandi non sono quotati. In secondo luogo, se si desidera utilizzare una macro, è necessario costringerlo a valutare ( e sul SO ) . Questo viene fatto con una combinazione di back-citazione (non solo citazione) e virgola. Si può vedere come questo viene fatto l'esempio con la macro kbd. Ho incluso anche una definizione di tasti, se non si utilizza la macro kbd. Se semplicemente citare una stringa nella vostra mappa della tastiera, che sarà stampare quando si preme la combinazione di tasti definita (proprio come per la definizione di combinazioni di tasti globali).

La mappa di tastiera non funziona con le macro kbd se non forzare la valutazione delle macro kbd con una combinazione della citazione schiena e virgola Come questo:.

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

Infine, è possibile aggiungere opzioni aggiuntive utilizzando parole chiave-args della forma :blah. Nell'esempio ho usato :global. Avremmo potuto definito l'intera modalità con parole chiave-args, ma è più breve per appena lista il valore init, più leggero e keymap nel giusto ordine.

Altri suggerimenti

È necessario avere codice come questo nella definizione modo minore:

(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)

Si potrebbe avere uno sguardo ai numerosi modi disponibili in EmacsWiki per riferimento.

Date un'occhiata a questo (solo per informazioni sulle combinazioni di tasti):

http: // www .gnu.org / software / emacs / manuale / html_node / emacs / Key-Bindings.html # Key-Binding

http: // www .gnu.org / software / emacs / manuale / html_node / emacs / Local-Keymaps.html # local-Keymaps

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

modalità principali Ben scritto verrà eseguito gancio alla fine. Quindi, è possibile utilizzare un gancio per definire la combinazione di tasti. modalità secondarie di solito non hanno ganci. In questo caso, si può chiamare “(richiede )”, quindi definire la combinazione di tasti.

Inoltre si potrebbe avere uno sguardo a: http://www.cs.utah.edu/ dept / vecchio / texinfo / emacs19 / emacs_35.html # SEC347

Forse la risposta accettata qui aiuta anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top