2011-01-11 13 views
13

sto lavorando in Haskell e spesso venire attraverso il codice simile al seguente:Emacs allineare-regexp on = ma non ==

func i j | i == j = i 
     | otherwise = j 

voglio per allineare il carattere dei '=' usando align-regexp, ma non ho il know-how elis. Ho provato a fare semplicemente "=" senza virgolette, ma questo inserisce un carattere di spazio indesiderato prima di ogni '='. Ho trovato una soluzione proposta here ma non riesco a ottenere che faccia nulla.

Si prega di aiutarmi a scrivere una funzione o una macro codificata che mi consentirà di impostare una combinazione di tasti per questo.

risposta

17

Cu Mxalign-regexpRET\(\s-*\) =RET1RET0RETn

(nb c'è uno spazio dopo il '=', ma non è molto evidente.)

Vale a dire ...

Utilizzare un argomento prefisso per indicare a align-regexp di chiedere più parametri di quanti ne faccia per impostazione predefinita.

Vedi C-h falign-regexp e C-h valign-rules-list per i dettagli, ma in breve:

\(\s-*\) è il 'gruppo' di default per la cancellazione/espansione. Aggiungiamo il nostro modello alla fine di questo: '='. (Si noti che \s- è sintassi regexp di Emacs per spazi bianchi.)

1 si riferisce semplicemente al gruppo 1 tra parentesi (come sopra). Questo è l'impostazione predefinita.

0 per la spaziatura da utilizzare tra le due parti della linea. Di default questo è 1 ed è il motivo per cui sei finito con uno spazio aggiuntivo.

n per non allineare eventuali corrispondenze di pattern successivi dopo il primo in ogni riga.

Edit: In realtà, il Q & A si è legato a quasi identici, e funziona bene per me su Emacs 23.2.1, quindi questo è un duplicato, ma per continuare e rispondere alla aspetto chiave vincolante:

È possibile associare quella (o qualsiasi) sequenza tramite i macro della tastiera. Ecco il risultato finale, che probabilmente puoi aggiungere al tuo file di init, anche se ti consiglio di seguire tu stesso il processo. Usa quello che ti piace al posto di C-c a per la chiave. C-c (letter) e F5-F9 sono riservati agli utenti finali per associare a loro piacimento, quindi uno di questi sarà sicuro di essere danneggiato dalla mappa dei tasti di una modalità.

(global-set-key (kbd "C-c a") (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 134217848 97 108 105 103 110 45 114 101 103 101 120 112 return 32 61 32 return return backspace 48 return 110] 0 "%d")) arg))) 

ho fatto da:

  1. selezione del testo.
  2. F3 per avviare la registrazione.
  3. esecuzione del align-regexp come sopra (facendo attenzione a digitare tutto testualmente, e non utilizzare la cronologia minibuffer o lo yanking).
  4. F4 per interrompere la registrazione.
  5. C-x C-k nalign-single-equalsRET per dare un nome alla macro
  6. M-xinsert-kbd-macroRETalign-single-equalsRET per ottenere la lisca.
  7. Avvolgere l'espressione (lambda) con (global-set-key) per collegarlo. (Anche se si potrebbe anche utilizzare il codice (fset 'align-single-equals ...) come previsto, e quindi associare la chiave di quel simbolo.

Se si commette un errore durante la registrazione di una macro complicata, non preoccupatevi — Emacs fornisce davvero un buon editor di macro che puoi usare per correggere eventuali errori dopo aver terminato la registrazione (basta digitare Cx Ck e), quindi non è necessario essere perfetti

modifica 2: può anche aggiungere un esempio di funzione, come da commenti

(defun my-align-single-equals() 
    "Align on a single equals sign (with a space either side)." 
    (interactive) 
    (align-regexp 
    (region-beginning) (region-end) 
    "\\(\\s-*\\) = " 1 0 nil)) 

(global-set-key (kbd "C-c a") 'my-align-single-equals) 
+0

Grazie. Sono stato in grado di utilizzare la tua soluzione ma ho creato una funzione invece di una macro, poiché è più leggibile per me. – Karl

+0

Beh, questo è ancora meglio :) Una funzione è decisamente preferibile se sei felice di scrivere in chiaro, ma i macro sono molto utili se non lo sei. – phils

+0

un po 'in ritardo per la festa, ma il modo canonico per risolverlo è aggiungere una regola a "align-rules-list" invece di scrivere la propria funzione. –

Problemi correlati