2009-09-12 15 views
6

Używam teraz Emacsa 23 z trybem wizualnego line-mode do edycji tekstu, ale nadal uderzam Mq z przyzwyczajenia (co dodaje twarde końcówki linii ...) . Zastanawiam się, czy istnieje sposób dodania warunkowego wyłączenia wypełnienia akapitu (lub usunięcia powiązania z Mq) dla trybów, w których włączony jest tryb linii wizualnej, ale ponownego włączenia go dla tych, w których nadal jestem używając trybu automatycznego napełniania? Dzięki!emacs: wizualny tryb liniowy i wypełnienie-akapit

Odpowiedz

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) 

Zamiast global-set-key, można również ponownie powiązać M-q tylko w określonych trybach. (Lub, możesz zmienić globalne powiązanie, a następnie powrócić do M-q z powrotem do M-q z powrotem do fill-paragraph w określonym trybie.) Zauważ, że wiele trybów jest ładowanych automatycznie, więc ich mapa klawiszy może nie zostać zdefiniowana, dopóki tryb nie zostanie aktywowany. Aby ustawić tryb specyficzne wiązania, zazwyczaj użyć funkcji takich jak to: (. Na remove-hook nie jest to bezwzględnie konieczne, ale funkcja wymaga jedynie, aby uruchomić jeden raz)

(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

globalnie ustawienie 'M-q' jest złe, ponieważ wpływa na wszystkie tryby. jeśli musisz to zrobić, użyj 'substitute-key-definition' (lub użyj defadvice lub fset zamiast tego) – mihi

+0

Ale to był cały sens. M-q jest już globalnym wiązaniem. Chciał, żeby się odbił do funkcji sprawdzającej wizualny tryb linii. – cjm

+0

Hmmm ... także świetna opcja ... Globalne ustawienie M-q może być niebezpieczne, ale funkcja jest wystarczająco prosta (i elegancka), że jej konsekwencje są przewidywalne? – hatmatrix

5

można użyć doradzaj w tym.

Dla .emacs:

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

to zmieni wypełnienia akapitu nic nie robić, kiedy linia tryb wizualny jest włączony. Jeśli wolisz, możesz też dodać błąd.

+0

Zauważ, że to całkowicie wyłącza' fill-paragraph' gdy włączony jest visual-line-mode, nawet jeśli jest on wywoływany z funkcji elisp. Prawdopodobnie nie chcesz być tak drastyczny. – cjm

+0

Zgadzam się, bardzo ładne ... ale cjm ma punkt ... chociaż nie wiem, jak często wypełnianie akapitu wywoływane jest z funkcji elips. – hatmatrix

+0

(Uwielbiam defadvice chociaż można go również wyłączyć bez ponownego uruchamiania emacsa) – hatmatrix

2

Tryb linii wizualnej ma własną mapę klawiszy: visual-line-mode-map. Polecam ponowne wiązanie M-q tylko w tej mapie klawiszy.

Mapa jest zdefiniowana jako część uruchamiania, więc nie potrzebujesz eval-after-load. Po prostu wyłącz powiązanie w tym trybie:

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

'ignore' to kanoniczne polecenie" weź dowolne argumenty i nic nie rób ". – phils

+0

Doskonale! Dziękuję @phils, zredagowałem swoją odpowiedź. (Ed: wcześniej definiowałem własną funkcję "noop" zamiast "ignore".) – Dato