2009-09-12 3 views
6

ora sto usando Emacs 23 con-line-modalità visiva girato di per la modifica del testo, ma continuare a colpire Mq per abitudine (aggiungendo così fine riga hard-wrapping ...) . Mi chiedo se c'è un modo per aggiungere un condizionale per disabilitare il paragrafo di riempimento (o rimuovere il legame a Mq) per le modalità in cui è attivata la modalità di visualizzazione a linea, ma per riattivarlo per quelle in cui sono ancora utilizzando la modalità di riempimento automatico? Grazie!emacs: linea-modalità visiva e Fill-punto

risposta

7
(defun maybe-fill-paragraph (&optional justify region) 
    "Fill paragraph at or after point (see `fill-paragraph'). 

Does nothing if `visual-line-mode' is on." 
    (interactive (progn 
     (barf-if-buffer-read-only) 
     (list (if current-prefix-arg 'full) t))) 
    (or visual-line-mode 
     (fill-paragraph justify region))) 

;; Replace M-q with new binding: 
(global-set-key "\M-q" 'maybe-fill-paragraph) 

Invece di usare global-set-key, è anche possibile associare nuovamente M-q solo nelle modalità specifiche. (Oppure, è possibile modificare l'associazione globale e quindi associare M-q a fill-paragraph in una modalità specifica.) Si noti che molte modalità sono caricate automaticamente, quindi la loro mappa di tasti potrebbe non essere definita fino a quando la modalità non viene attivata. Per impostare una modalità di legame specifico, io di solito uso una funzione come questa: (. Il remove-hook non è strettamente necessario, ma la funzione ha solo bisogno di eseguire una volta)

(add-hook 'text-mode-hook 
    (defun cjm-fix-text-mode() 
    (define-key text-mode-map "\M-q" 'maybe-fill-paragraph) 
    (remove-hook 'text-mode-hook 'cjm-fix-text-mode))) 

+0

l'impostazione globale "M-q" è malvagia, perché influisce su tutte le modalità. se devi fare questo, usa 'sostituto-chiave-definizione' (o usa defadvice o fset invece) – mihi

+0

Ma quello era il punto. M-q è già un legame globale. Voleva che rimbalzasse su una funzione che controllava la modalità visuale. – cjm

+0

Hmmm ... anche una grande opzione ... L'impostazione globale di M-q potrebbe essere pericolosa, ma la funzione è abbastanza semplice (ed elegante) che le sue conseguenze sono prevedibili? – hatmatrix

5

è possibile utilizzare un consigliare per questo.

Per i vostri .emacs:

(defadvice fill-paragraph (around disable-for-visual-line-mode activate) 
    (unless visual-line-mode 
    ad-do-it)) 

questo cambierà fill-punto di non fare nulla quando visivo-line-modalità è attiva. Puoi anche aggiungere un errore se preferisci questo.

+0

Nota che questo disabiliterà completamente' fill-paragraph' quando la modalità visuale-line è attiva, anche se viene chiamata da una funzione elisp. Probabilmente non vuoi essere così drastico. – cjm

+0

Sono d'accordo, molto carina ... ma cjm ha un punto ... anche se non so quanto spesso viene chiamato il paragrafo di riempimento dalle funzioni elisp. – hatmatrix

+0

(Adoro defadvice anche perché puoi anche spegnerlo senza riavviare emacs) – hatmatrix

2

visivo-line-mode ha la propria mappa della tastiera: visual-line-mode-map. Raccomando di riavviare M-q solo in quella mappa dei tasti.

La mappa è definito come parte di avvio, quindi non è necessario eval-post-carico. Basta disabilitare l'associazione in questa modalità:

(define-key visual-line-mode-map [remap fill-paragraph] 'ignore) 
+1

'ignore' è il comando canonico" prendere qualsiasi argomento e non fare nulla ". – phils

+0

Eccellente! Grazie @phils, ho modificato la mia risposta. (Ed: in precedenza stavo definendo la mia funzione noop invece di 'ignorare.) – Dato