2010-07-02 19 views
5

Próbuję przełączyć się z Vima na Emacsa, ale wyrywam sobie włosy, próbując skonfigurować je tak, by traktować karty tak, jak chcę. I wymagają:Globalna konfiguracja kart Emacsa

  • wstawione „zakładki”, aby powiększać się dwa przestrzeni. Emacs uparcie trzyma się ośmiu, bez względu na to, co robię.
  • Znaki (to jest prawdziwe znaki \t), które mają być reprezentowane na ekranie przez dwa spacje.
  • Naciśnięcie klawisza TAB powinno wstawić tabulator przy kursorze zamiast wcięcia całej linii. Obecnie wciskam TAB gdziekolwiek, a Emacs niszczy wszystkie spacje na początku linii; to jak dotąd najbardziej irytujące.

mojego obecnego ~/.emacs czyta

(setq standard-indent 2) 
(setq-default indent-tabs-mode nil) 

ale Próbowałem bez końca sugerowanych konfiguracji z sieci, z których żadna nie zrobili tego, co powiedział, że tak. (Czy API ciągle się zmienia?) Najwyraźniej używam GNU Emacs 23.1.1.)

Odpowiedz

7

Emacs ma bardzo elastyczne wsparcie dla obsługi wcięć. Zasadniczo tryb, w którym jesteś, dyktuje, jak działają - więc jeśli pracujesz nad plikiem C, to sposób, w jaki działa karta naciskająca, będzie inny niż w przypadku pracy z plikiem Pythona.

To zależy od trybu, w którym pracujesz, co ograniczy otrzymywane odpowiedzi. W większości przypadków polecam, abyś nie walczył z tym - dla mnie zachowanie wcięcia jest jedną z najlepszych cech emacs. Musisz jednak poświęcić czas na samodzielne dostosowanie.

Aby zmienić sposób wyświetlania zakładek, należy ustawić szerokość tabulatora na 2. Jeśli edytujesz kod Java lub C, brzmi to tak, jakbyś chciał wyłączyć wszystkie przydatne funkcje wcięcia do NIL :

  • c-tab-zawsze-indent
  • c-syntaktyczny-wcięcie
  • indent-tabs-mode

proponuję ustawić je za pośrednictwem interfejsu dostosowywania. Jeśli używasz "M-x customize-group RET C", możesz zobaczyć różne ustawienia trybu C.

Jeśli edytujesz różne typy plików, instrukcje będą się różnić.

Być może emacs jest w niewłaściwym trybie dla pliku. Możesz spróbować zrobić "podstawowy tryb M-x", aby sprawdzić, czy wolisz tam zachowanie.

1

To powinno ci dać większość tego, co chcesz. Prawdopodobnie będziesz musiał dostosować inne tryby programowania, z których zwykle korzystasz.

(defun insert-tab() 
    "self-insert-command doesn't seem to work for tab" 
    (interactive) 
    (insert "\t")) 
(setq indent-line-function 'insert-tab) ;# for many modes 
(define-key c-mode-base-map [tab] 'insert-tab) ;# for c/c++/java/etc. 
(setq-default tab-width 2) 
3
;; * Inserted "tabs" to be expanded into two spaces. Emacs stubbornly 
;; sticks to eight, no matter what I do. 

;; * Tabs (i.e. real \t characters) to be represented on screen by two 
;; spaces. 

(setq-default tab-width 2) 


;; * Pressing TAB should insert a tab at the cursor rather than indent 
;; the entire line. Currently, I press TAB anywhere and Emacs 
;; destroys all whitespace at the start of the line; this is the 
;; most infuriating thing so far. 

(setq-default indent-tabs-mode t) 

(mapcar (lambda (hooksym) 
      (add-hook hooksym 
        (lambda() 
         (kill-local-variable 'indent-tabs-mode) 
         (kill-local-variable 'tab-width) 
         (local-set-key (kbd "TAB") 'self-insert-command)))) 

     '(
      c-mode-common-hook 

      ;; add other hook functions here, one for each mode you use :-(
     )) 

;; How to know the name of the hook function? Well ... visit a file 
;; in that mode, and then type C-h v major-mode RET. You'll see the 
;; mode's name in the *Help* buffer (probably on the second line). 

;; Then type (e.g.) C-h f python-mode; you'll see blather about the 
;; mode, and (hopefully) somewhere in there you'll see (again e.g.) 
;; "This mode runs the hook `python-mode-hook', as the final step 
;; during initialization."