2012-06-16 15 views
10

Czasami chcę, aby komentarze tymczasowe były w pełni uzasadnione na linii (//) lub bloku linii /* */. Jednak CC Mode przesłania to przez automatyczne wcięcie po wpisaniu drugiego klawisza. Generalnie podoba mi się automatyczne wcięcie słów kluczowych, itp., Ale wolałbym, aby był wyłączony dla komentarzy. (Aktualizacja: tj. Chcę wyłączyć droga komentarz wcięcie jest wyzwalane przez C-elektryczno kluczowych powiązań , ale komentarze powinny nadal wciąć normalnie othewise)W emacs, jak wyłączyć automatyczne wcięcie komentarza w C/C++?

Próbowałem umieszczenie tych linii w .emacs, ale to nie przeszkadza w zachowaniu.

(c-electric-slash nil) 
(c-electric-star nil) 

Odpowiedz

8

Krótka odpowiedź:

(eval-after-load 'cc-mode 
    '(progn 
    (define-key c-mode-base-map "/" 'self-insert-command) 
    (define-key c-mode-base-map "*" 'self-insert-command))) 

Oto jak idę o to:

Sprawdzaj funkcję związaną /: C-h k /

Mówi "/ uruchamia polecenie c-electric-slash, które jest interaktywną skompilowaną funkcją Lisp w 'cc-cmds.el'".

(Jeśli nie widzisz linku do cc-cmds.el, wtedy nie masz zainstalowanego źródła Elisp. Zakładając, że nie jesteś na Windows, można użyć menedżera pakietów swojego systemu, aby zainstalować pakiet emacs-el i spróbuj ponownie.)

Kliknij ten link, aby otworzyć cc-cmds.el. Wyszukiwanie c-electric-slash nie wykrywa niczego poza definicją funkcji, więc klucze nie są związane w tym pliku. Wyszukiwanie w cc-mode.el z tego katalogu ujawnia:

(define-key c-mode-base-map "/" 'c-electric-slash) 

Teraz wiemy nazwę „keymap”, w którym, aby zastąpić / kombinacja klawiszy.

Jeśli dodać coś takiego do pliku init prawdopodobnie będziesz pojawia się błąd przy starcie:

(define-key c-mode-base-map "/" 'self-insert-command) 

... bo plik init załadowany przed cc-mode.el jest i c-mode-base-map jest niezdefiniowany. Więc używamy eval-after-load (jak na górze mojej odpowiedzi). Pierwszy argument, 'cc-mode, musi pasować do instrukcji provide na samym końcu cc-mode.el. Jeśli nie wiesz, co oznacza progn, wykonaj C-h f progn.

Jeśli podoba Ci się ten styl uczenia się/odkrywania Emacsa, możesz rozważyć przeczytanie mojego "How to learn Emacs".

+0

Genialny! Co za świetne wyjaśnienie! ... i to też działa :) ... Dziękuję ... i ja ' Z pewnością będę czytał twój sugerowany przewodnik –

+0

Sugestia: Zaktualizuj to, aby użyć 'z-eval-after-load' –

+0

Co jest warte, borykałem się z tym problemem podczas tworzenia głównego trybu uzyskanego z' c-mode'. dodając dwie linie 'define-key' do definicji mapy klawiaturowej mojego trybu (i zmieniając' c-mode-base-map' na nazwę mojej lokalnej mapy), udało mi się wyeliminować to zachowanie. Dzięki! – ohruunuruus

0

Proponuję zajrzeć do c-indent-comment-alist & c-indent-comments-syntactically-p zmiennych. Zobacz więcej informacji w pomocy dla tych zmiennych (C-h v) oraz w sekcji "Customizing Indentation" i "Style Variables" podręcznika CC-mode

+0

Nie przeczytałem jeszcze wszystkiego (nie wspominając już o nowym żargonie emacs), ale mam wrażenie, że twoja sugestia zmienia się *** jak wciskają się *** rzeczy.Nie chcę zmieniać zachowania wcięć: chcę, aby linie komentarzy wciskały się normalnie w większości sytuacji, ale nie chcę * (c-electric-slash * i * (c-electric-star * dyktować, że wcięcie występuje *** po naciśnięciu *** '/' lub '*' Być może jest to tak proste, jak ponowne powiązanie klawiszy '/' i '*' z funkcji * electric * z 'self-insert-command' , ale tylko dla * CC Mode * (to trochę nie wiem jak to zrobić) –

Powiązane problemy