Come posso associare un'espressione regolare per una combinazione di tasti in emacs?

StackOverflow https://stackoverflow.com/questions/10149

  •  08-06-2019
  •  | 
  •  

Domanda

Per il contesto, sono qualcosa di emacs che il novizio.Non l'ho usato per molto tempo, ma utilizzano sempre di più (mi piace molto).Anche io mi trovo bene con il lisp, ma non super familiarità con elisp.

Quello che devo fare è associare una espressione regolare per una combinazione di tasti, perché io uso questo particolare regex così spesso.

Quello che ho fatto:

M-C-s ^.*Table\(\(.*\n\)*?GO\)

Nota, ho usato il carattere di nuova riga sopra, ma ho scoperto che per isearch-forward-regexp, si ha realmente bisogno di sostituire il \n nell'espressione regolare con il risultato di C-q q-j.Questo inserisce un valore letterale di newline (senza terminare il comando) e mi permette di inserire una nuova riga nell'espressione e di corrispondenza tra le righe.

Come posso collegare questo ad una combinazione di tasti?

Ho vagamente capito che ho bisogno di creare un elisp funzione che esegue isearch-forward-regexp con l'espressione, ma io sono fuzzy sui dettagli.Ho cercato su google e ho trovato la maggior parte della documentazione ad essere un po ' di confusione.

Come posso associare una espressione regolare per una combinazione di tasti in emacs?


Mike Stone era la risposta migliore fino ad ora-non esattamente quello che stavo cercando, ma ha funzionato per quello che mi serviva

Edit - questo tipo di lavorato, ma dopo la memorizzazione di macro, quando sono tornato per utilizzarlo in un secondo momento, non ho potuto usarlo con C-x e.(cioè, se io riavvio emacs e quindi digitare M-x macro-nome, e quindi C-x e, Ricevo un messaggio nel minibuffer come 'no ultimo kbd macro" o qualcosa di simile)


@Mike Stone - Grazie per le informazioni.Ho cercato di creare una macro in questo modo:

C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)

Questo ha creato la mia macro, ma quando ho eseguito il mio macro non ho avuto la stessa evidenziando che io di solito quando uso isearch-forward-regexp.Invece è saltato per la fine della prossima partita di espressione.Quindi, non e ' proprio per quello che mi serve.Tutte le idee?

Edit:Mi sembra può utilizzare le macro per fare quello che voglio, devo solo pensare al di fuori della casella di isearch-forward-regexp.Proverò quello che hai suggerito.

È stato utile?

Soluzione

È possibile utilizzare le macro, basta fare C-x ( quindi fare di tutto per la macro, quindi C-x ) per terminare la macro, quindi C-x e eseguirà l'ultima definizione di macro.Quindi, è possibile assegnare un nome utilizzando M-x nome-cognome-kbd-macro che consente di assegnare un nome ad esso, che è quindi possibile richiamare con M-x TESTIT, quindi memorizzare la definizione utilizzando M-x inserire-kbd-macro per attivare la macro nel buffer corrente, e quindi è possibile memorizzare nel vostro .emacs file.

Esempio:

C-x( abc *return* C-x)

Definire una macro di tipo "abc" e premere invio.

C-xeee

Esegue la macro sopra immediatamente, 3 volte (prima e lo esegue, e poi 2 e la volontà di eseguire due volte di più).

M-x name-last-kbd-macro testit

Nomi la macro "testit"

M-x testit

Esegue il proprio nome macro (stampe "abc", per poi tornare).

M-x insert-kbd-macro

Lo mette nel buffer corrente:

(fset 'testit
   [?a ?b ?c return])

Che possono poi essere salvati nella vostra .emacs file uso il macro più e più volte dopo il riavvio di emacs.

Altri suggerimenti

Ho iniziato con la soluzione del problema, letteralmente,

(defun search-maker (s)
  `(lambda ()
     (interactive)
     (let ((regexp-search-ring (cons ,s regexp-search-ring)) ;add regexp to history
           (isearch-mode-map (copy-keymap isearch-mode-map)))
       (define-key isearch-mode-map (vector last-command-event) 'isearch-repeat-forward) ;make last key repeat
       (isearch-forward-regexp)))) ;`

(global-set-key (kbd "C-. t") (search-maker "^.*Table\\(\\(.*\\n\\)*?GO\\)"))
(global-set-key (kbd "<f6>") (search-maker "HELLO WORLD"))

La sequenza di tasti da (kbd ...) inizia una nuova ricerca vuote.Effettivamente la ricerca di una stringa, si preme ultimo tasto di nuovo, come tante volte quanto è necessario.Così C-. t t t o <f6> <f6> <f6>.La soluzione è fondamentalmente un hack, ma lascio qui, se si vuole sperimentare con esso.

Il seguente è probabilmente il più vicino a ciò che è necessario,

(defmacro define-isearch-yank (key string)
  `(define-key isearch-mode-map ,key 
     (lambda ()
       (interactive) 
       (isearch-yank-string ,string)))) ;`

(define-isearch-yank (kbd "C-. t") "^.*Table\\(\\(.*\\n\\)*?GO\\)")
(define-isearch-yank (kbd "<f6>") "HELLO WORLD")

La chiave combo ora funziona solo in isearch modalità.Si avvia la ricerca, normalmente, quindi premere il tasto combo per inserire la stringa predefinita.

@Justin:

Quando si esegue una macro, è un po ' diverso...ricerca incrementale sarà solo accadere una volta, e sarà necessario eseguire nuovamente la macro, se vuoi cercare di nuovo.Si può fare di più potente e complesso di cose anche se, come la ricerca per parola chiave, saltare all'inizio della linea, segno, vai alla fine della riga, M-w (copia), per poi passare a un altro buffer, quindi C-y (pasta), poi di nuovo un altro buffer e la fine di una macro.Quindi, ogni volta che si esegue la macro sarà la copia di una linea per la prossima buffer.

La cosa veramente bella di emacs macro si è fermata, quando si vede la campana...che succede quando non si riesce ad abbinare una ricerca incrementale (tra le altre cose).Così la macro precedente, è possibile fare in C-u 1000 C-x e per eseguire la macro 1000 volte...ma visto che hai fatto una ricerca, sarà solo la copia di 1000 linee, O FINO a quando LA RICERCA non RIESCE!Il che significa che se ci sono 100 partite, sarà solo eseguire la macro 100 volte.

EDIT:Check out C-hf evidenziare linee di corrispondenza delle regexp che mostrerà l'aiuto di un comando che mette in evidenza tutto corrispondenti a una regex...Non so come annullare l'evidenziazione, anche se...comunque si potrebbe utilizzare una stored macro per evidenziare tutte le regex, e poi un'altra macro per trovare il successivo...?

ULTERIORE MODIFICA:M-x unhighlight-regexp annulla l'evidenziazione, è necessario immettere l'ultimo regex anche se (ma di default per la regex è utilizzato per evidenziare)

In generale, per definire una azione in Emacs, devi scrivere

(define-key global-map (kbd "C-c C-f") 'function-name)

define-key è, ovviamente, la funzione di definire una nuova chiave. global-map a livello globale, la mappa della tastiera, anziché le singole mappe per ogni modalità. (kbd "C-c C-f") restituisce una stringa che rappresenta la sequenza di tasti C-c C-f.Ci sono altri modi per farlo, tra cui inserendo la stringa direttamente, ma questo di solito è il più semplice in quanto richiede la normale rappresentazione scritta. 'function-name è un simbolo che è il nome della funzione.

Ora, a meno che la funzione è già definito, si desidera definire prima di utilizzare questo.Per fare questo, scrivere

(defun function-name (args)
  (interactive)
  stuff
  ...)

defun definisce una funzione di uso C-h f defun per informazioni più specifiche.Il (interactive) non c'è davvero una chiamata di funzione;dice al compilatore che va bene per la funzione di essere chiamato dall'utente utilizzando M-x function-name e tramite le combinazioni di tasti.

Ora, interattivi per la ricerca, in particolare, questo è difficile;il isearch modulo sembra non essere impostato per quello che stai cercando di fare.Ma è possibile utilizzare questo per fare qualcosa di simile.

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