2010-01-05 13 views
6

Uso emacs per modificare tutto. Su alcuni dei miei documenti LateX mi piacerebbe disabilitare automaticamente la modalità di riempimento automatico quando sto modificando tabelle e codice. Fondamentalmente, mi piacerebbe avere due tag, ad esempio:Soppressione emacs riempimento automatico in una regione selezionata

%%% BEGIN NO FILL 
    %%% END NO FILL 

e nulla tra di loro sarà riempito automaticamente.

Qualcuno può pensare a un modo per farlo? Avrei bisogno di capire se il cursore è o meno all'interno della regione e quindi dover passare dalla modalità, e avremmo bisogno di farlo ogni volta che il cursore si sposta. O c'è un modo migliore per farlo?

+0

grande domanda! Sono curioso di sapere se c'è una soluzione da solo. – bnbeckwith

+0

Penso che potremmo aver bisogno di scriverlo da soli ... – vy32

risposta

1

Capito. Check this out:

(defun in-no-auto-fill-region() 
    (> (save-excursion (or (search-backward "%%% BEGIN NO FILL" (point-min) t) 0)) 
    (save-excursion (or (search-backward "%%% END NO FILL" (point-min) t) 0)) 
    )) 

(defun previous-line-checking-auto-fill (arg) 
    (interactive "P") 
    (previous-line arg) 
    (if (in-no-auto-fill-region) 
     (turn-off-auto-fill) 
    (turn-on-auto-fill))) 

(defun next-line-checking-auto-fill (arg) 
    (interactive "P") 
    (next-line arg) 
    (if (in-no-auto-fill-region) 
     (turn-off-auto-fill) 
    (turn-on-auto-fill))) 

(add-hook 'LaTeX-mode-hook 
     '(lambda nil 
    (local-set-key "C-p" 'previous-line-checking-auto-fill) 
    (local-set-key "C-n" 'next-line-checking-auto-fill) 
    (auto-fill-mode 1) 
    )) 
2

Se si utilizza AUCTeX (si dovrebbe essere), si consiglia di controllare LaTeX-indent-environment-list. L'aggiunta di un ambiente a questa variabile farà sì che (tra le altre cose) M-q non riempia nuovamente il paragrafo. Sfortunatamente non sembra funzionare per la modalità auto-fill. Il seguente codice in gran parte non testato aggiunto a LaTeX-mode-hook potrebbe fare ciò che vuoi.

(setq auto-fill-function 
    (lambda() 
    (unless (> (save-excursion (or (search-backward "%%% BEGIN NO FILL" (point-min) t) 0)) 
       (save-excursion (or (search-backward "%%% END NO FILL" (point-min) t) 0))) 
     (do-auto-fill)))) 

È molto stupido e inefficiente, ma sembra essere abbastanza veloce sulla mia macchina. Non consente la nidificazione e richiede di contrassegnare manualmente tutte le sezioni che non si desidera riempire. Quello che sto pensando di aggiungere al mio .emacs (fino a quando ho letto la tua domanda non mi sono reso conto di quanto questo mi abbia infastidito) è al di sotto delle chiavi fuori dall'ambiente corrente, quindi non c'è bisogno di markup speciali (anche se guarda solo l'ambiente più interno (non sono sicuro di quale problema causerà in pratica)). La combinazione dei due è lasciata come esercizio al lettore interessato.

;; You can use the following to unset the variables and play around with them 
;; (makunbound 'auto-fill-ignore-environments) 
;; (makunbound 'auto-fill-ignore-environments-regexp) 
(defcustom auto-fill-ignore-environments 
    (mapcar 'car LaTeX-indent-environment-list) 
    "List of environments for which `auto-fill-mode' should be 
disabled. Used to generate `auto-fill-ignore-environments-regexp'." 
    :type '(sexp) 
) 
(defcustom auto-fill-ignore-environments-regexp 
    (regexp-opt auto-fill-ignore-environments) 
    "Regexp matching LaTeX environments for which `auto-fill-mode' 
should be disabled. If not set, automatically generated from 
`auto-fill-ignore-environments'" 
    :type '(string) 
    :set-after '(auto-fill-ignore-environments) 
) 
(add-hook 'LaTeX-mode-hook 
      (lambda() 
      (setq auto-fill-function 
        (lambda() 
        (unless (string-match auto-fill-ignore-environments-regexp 
              (LaTeX-current-environment)) 
         (do-auto-fill)))))) 

Non ho mai usato defcustom prima quindi sono sicuro che la parte potrebbe essere migliorata un bel po '.

+0

Grazie. Sto solo usando la modalità tex.el incorporata in MacOS. Credo che avrò bisogno di scoprire AUCtex. Il sistema è inefficiente ma sembra intelligente. Nesting non è importante. Scommetto che potremmo farlo attivare e disattivare il riempimento automatico con il cursore su e giù ... – vy32

+1

Sì, potresti probabilmente analizzare il file e aggiungere proprietà o sovrapposizioni di testo con proprietà point-left e point-immesse. Una difficoltà con questo è che devi mantenere le proprietà del testo in sincrono che può essere un dolore. So che alcune modalità di piegatura fanno qualcosa del genere. Oppure potresti consigliare i comandi di movimento, ma ce ne sono tantissimi, e penso che finirebbero per essere eseguiti più spesso quando digiti un carattere di riempimento automatico, ad es. spazio. Forse potresti cavartela consultando solo alcuni comandi di movimento. –

+0

Esiste un modo generale per consigliare i comandi di movimento o in movimento? Ho trovato una soluzione che riassocia semplicemente^p e^n. – vy32

0

In alternativa, è possibile disattivare la modalità di riempimento automatico e utilizzare M-q per formattare i paragrafi. Non amo il nervosismo del riempimento automatico, quindi lo uso in ogni modalità.

0

Se si vuole andare il percorso di consulenza/ridefinire tutte le funzioni di movimento, questo dovrebbe aiutare:

(defmacro movement-advice (func) 
    `(defadvice ,func (after ; run this after the original function is done (and point has moved) 
        ;; Give it a unique name 
        ,(intern (concat (symbol-name func) "-auto-fill-auto-off")) 
        ;; Hopefully this satisfies the arguments of any function we can throw at it 
        (&rest args) 
        ;; turn it on 
        activate 
        ) 
    "Turn auto-fill-mode on or off automatically." 
    (auto-fill-mode (not (in-no-auto-fill-region))))) 

(dolist (func '(next-line 
       previous-line 
       forward-paragraph 
       backward-paragraph 
       mouse-drag-region 
       ;; Whatever you use 
       )) 
    (eval `(movement-advice ,func))) 
+0

Huh. Ho bisogno di conoscere questa roba del consiglio. Grazie. – vy32

+0

Hm. Ad ogni modo per limitarlo alla modalità LaTeX, e non ad ogni modalità? – vy32

+0

Stranamente, questo non funziona: (modalità di riempimento automatico (non (in-no-auto-fill-region))) Questo è necessario: (se (in-no-auto-fill-region \t (disattivazione automatica) (attivazione automatica riempimento))) Non ho idea del perché. – vy32

Problemi correlati