2015-08-02 24 views
5

Ho un sacco di link salvati in un file orgmode, diciamo ...Esiste un'applica-comando-a-ogni-linea-in-regione in emacs?

http://www.stackoverflow.com 
http://www.google.com 
http://www.github.com 

posso aprire ciascuno avendo il cursore sul link e fare C-c C-o, e si apre comodamente il mio browser predefinito e apre quel link in una scheda.

Ora supponiamo di avere 20 di questi collegamenti. C'è un modo conveniente per applicare una funzione come questa a ciascuna linea all'interno di una regione selezionata, senza registrare una macro esplicita?

mi immagino che cerca qualcosa di simile ...

Select region 
M-x foreach-in-region 
Keystrokes to apply to each line: C-c C-o 

E questo è solo per le funzioni già definite. Immagino che il modo senza sarebbe qualcosa di simile ...

with cursor on first line of link 
F3 # to start record macro 
C-c C-o 
down arrow 
F4 
Select region (omitting the first line, since that's now already opened in my browser) 
C-x C-k r 

Esiste? Altrimenti, come potrei pronunciarlo?

risposta

5
(defun do-lines (fun &optional start end) 
    "Invoke function FUN on the text of each line from START to END." 
    (interactive 
    (let ((fn (intern (completing-read "Function: " obarray 'functionp t)))) 
    (if (use-region-p) 
     (list fn (region-beginning) (region-end)) 
     (list fn (point-min) (point-max))))) 
    (save-excursion 
    (goto-char start) 
    (while (< (point) end) 
     (funcall fun (buffer-substring (line-beginning-position) (line-end-position))) 
     (forward-line 1)))) 

aggiornamento dopo il tuo commento -

Ora sembra che tu voglia di non immettere un nome di funzione, ma ha colpito una chiave, e hanno il comando associato a quel tasto essere applicato a ogni riga nella regione (o buffer).

Qualcosa come il seguente lo farà. Tuttavia, tieni presente che il comando ha spesso linee di comportamento particolari. Ad esempio, se premi il tasto C-k (kill-lines), questo si sposta già in avanti dopo ogni riga che uccide. Perché do-lines non sa quale tipo di funzione (comando) invocherai, avanza alla riga successiva dopo ogni invocazione. Per un comando come kill-lines, ciò farà quindi la cosa sbagliata: finirà per far avanzare due linee, non una, saltando così le linee. IOW, si tenga presente che il codice per do-lines non è in grado di compensare ciò che una particolare funzione invoca potrebbe comportare che potrebbe non corrispondere a quanto previsto. Invece, fa quello che dice che fa.

(defun do-lines (command &optional start end) 
    "Invoke COMMAND on the text of each line from START to END." 
    (interactive 
    (let* ((key (read-key-sequence-vector "Hit key sequence: ")) 
      (cmd (lookup-key global-map key t))) 
    (when (numberp cmd) (error "Not a valid key sequence")) 
    (unless (commandp cmd) (error "Key `%s' is not defined" (key-description key))) 
    (if (use-region-p) 
     (list cmd (region-beginning) (region-end)) 
     (list cmd (point-min) (point-max))))) 
    (setq start (copy-marker start) 
     end (copy-marker end)) 
    (save-excursion 
    (goto-char start) 
    (while (< (point) end) 
     (funcall command (buffer-substring (line-beginning-position) (line-end-position))) 
     (forward-line 1)))) 
+0

Quando si esegue questa operazione sulla mia selezione, viene visualizzato "C-c C-o" non definito, sebbene definito per una singola riga. – Mittenchops

+0

Non so cosa intendi. Cos'è 'C-c C-o'? Dove lo hai definito e cosa ti aspetti che faccia? Quando invochi 'do-lines' (ma lo invochi - con un tasto o con' M-x'), ti chiede di applicare la funzione a ogni riga. Come definito ora, è necessario dargli un nome di funzione, non solo premere un tasto. – Drew

7

Si dovrebbe registrare la macro per una linea, quindi utilizzare apply-macro-to-region-lines per eseguirlo per tutte le linee della regione. C-x C-k r

In alternativa, è possibile utilizzare più cursori per creare un cursore su ciascuna linea e C-c C-o aprire tutti. multiple-cursors trasformerà i tuoi schemi di utilizzo nel tempo per il meglio se gli dai una possibilità.

+0

'C-c C-o' è una combinazione di tasti predefinita in più cursori? Meglio nominare il defun invocato imo. – Squidly

+1

È l'OP di associazione a cui si fa riferimento dalla modalità markdown. –