Ustaw 4 wcięcia spacji w Emacsie w trybie tekstowym

Nie udało mi się przełączyć Emacsa z 8 spacji na 4 spacje po naciśnięciu karty w buforach z trybem głównym text-mode. Dodałem do mojego .emacs:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

Bez względu na to, jak zmienię mój plik .emacs (lub lokalne zmienne mojego bufora), przycisk TAB zawsze robi to samo.

  1. Jeśli nie ma tekstu powyżej, tiret 8 spacje
  2. Jeśli w poprzednim wierszu znajduje się tekst, wcięcie na początek drugie słowo
Jak bardzo kocham Emacsa to robi się irytujące. Czy jest jakiś sposób, aby Emacs miał co najmniej 4 spacje, gdy w poprzednim wierszu nie ma tekstu?
Author: amalloy, 2008-09-16

19 answers

(customize-variable (quote tab-stop-list))

Lub dodać tab-stop-listdo custom-set-variables W .emacs Plik:

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))
 27
Author: Bert F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 07:19:32

Krótka odpowiedź:

Kluczowym punktem jest polecenie Emacsa, aby wstawiał cokolwiek chcesz podczas wcięcia, odbywa się to poprzez zmianę funkcji indent-line. Łatwiej jest zmienić go, aby wstawić kartę, a następnie zmienić tabulatory na 4 spacje, niż zmienić go, aby wstawić 4 spacje. Poniższa konfiguracja rozwiąże twój problem:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

Wyjaśnienie:

Z wcięcia kontrolowane przez Tryb główny @ podręcznik emacs :

Ważną funkcją każdego większego tryb jest aby dostosować klucz do wcięcie właściwe dla języka będącego edycja.

[...]

Zmienna funkcji indent-line jest funkcja, która ma być używana przez (i różne komendy, np. podczas wywoływania indent-region), aby wcięcie bieżącego Kolejka Dowództwo wcięcie zgodnie z trybem nie ma więcej niż wywołać tę funkcję.

[...]

Domyślną wartością jest indent-relative dla wielu trybów.

From indent-relative @ emacs Instrukcja:

Indent-relative Space out to under next Wcięcie w poprzednim wierszu nieblank.

[...]

Jeśli poprzednia linia nieblank nie ma punkty wcięcia poza punktem kolumny zaczyna się od, "tab-to-tab-stop" jest zrobione zamiast tego.

Wystarczy zmienić wartość funkcji indent-line na funkcję insert-tab i skonfigurować wstawianie tabulacji jako 4 spacje.

 128
Author: alcortes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 00:52:45

Zawsze trochę mnie boli widząc rzeczy takie jak {[2] } Kiedy funkcja number-sequence czeka na użycie.

(setq tab-stop-list (number-sequence 4 200 4))

Lub

(defun my-generate-tab-stops (&optional width max)
  "Return a sequence suitable for `tab-stop-list'."
  (let* ((max-column (or max 200))
         (tab-width (or width tab-width))
         (count (/ max-column tab-width)))
    (number-sequence tab-width (* tab-width count) tab-width)))

(setq tab-width 4)
(setq tab-stop-list (my-generate-tab-stops))
 64
Author: phils,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 21:20:05

Może być łatwiej skonfigurować karty w następujący sposób:

M-x customize-group

W wierszu Customize group: Wprowadź indent.

Zobaczysz ekran, na którym możesz ustawić wszystkie opcje wcięcia i ustawić je dla bieżącej sesji lub zapisać je dla wszystkich przyszłych sesji.

Jeśli zrobisz to w ten sposób, będziesz chciał skonfigurować plik customizations.

 19
Author: Dave Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 08:23:05
(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)
 11
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 04:55:33
(defun my-custom-settings-fn ()
  (setq indent-tabs-mode t)
  (setq tab-stop-list (number-sequence 2 200 2))
  (setq tab-width 2)
  (setq indent-line-function 'insert-tab))

(add-hook 'text-mode-hook 'my-custom-settings-fn)
 9
Author: lawlist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-21 20:51:42
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux") 
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

To działa dla kodu C++ i komentarza wewnątrz też

 8
Author: user2318996,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-25 09:39:15

Ten problem nie jest spowodowany brakiem tabulacji, chodzi o to, że emacs ma (nowy?) metoda tab o nazwie indent-relative, która wydaje się zaprojektowana do wyrównywania danych tabelarycznych. Klawisz TAB jest mapowany do metody indent-for-Tab-command, która wywołuje dowolną metodę zmiennej indent-line-function, która jest metodą indent-relative dla trybu tekstowego. Nie wymyśliłem dobrego sposobu na nadpisanie zmiennej funkcji indent-line (hook trybu tekstowego nie działa, więc może jest resetowany po mode-hooks run?) ale jednym z prostych sposobów na pozbycie się tego zachowania jest po prostu rzucenie metody intent-for-Tab-command poprzez ustawienie TAB na prostszą metodę tab-to-tab-stop:

(define-key text-mode-map (KBD" TAB") 'tab-to-tab-stop)

 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-12 00:05:45

Spróbuj tego:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

Spowoduje to, że TAB zawsze wstawi literalny znak tabulacji, a tab zatrzyma się co 4 znaki (ale tylko w trybie tekstowym). Jeśli nie o to prosisz, opisz zachowanie, które chciałbyś zobaczyć.

 6
Author: cjm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 07:53:41

Możesz dodać te linie kodu do swojego .plik emacs. Dodaje hook dla trybu tekstowego, aby użyć insert-tab zamiast indent-relative.

(custom-set-variables
 '(indent-line-function 'insert-tab)
 '(indent-tabs-mode t)
 '(tab-width 4))
(add-hook 'text-mode-hook
      (lambda() (setq indent-line-function 'insert-tab)))
Mam nadzieję, że to pomoże.
 5
Author: gigilibala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-29 00:37:09

Sama zmiana stylu z C-set-style mi wystarczyła.

 4
Author: dividebyzero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-21 01:21:20

Dodaj to do swojego .plik emacs:

To ustawi szerokość karty na 2 znaki (zmień liczbę 2 na dowolną)

(setq default-tab-width 2)

Aby upewnić się, że emacs używa tabulatorów zamiast spacji:

(global-set-key (kbd "TAB") 'self-insert-command)

Na marginesie, domyślnym dla Emacsa podczas Backspace ' u nad tabulatorem jest przekonwertowanie go na spacje, a następnie usunięcie spacji. To może być irytujące. Jeśli chcesz, aby po prostu usunąć kartę, możesz to zrobić:

(setq c-backspace-function 'backward-delete-char)
Smacznego!
 4
Author: qwerty9967,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 20:07:25

Dostosowywanie może być cieniem (setq tab width 4), więc albo użyj setq-default, albo daj znać, co robisz. Miałem też problemy podobne do OP i naprawiłem je tylko tym, nie musiałem dostosowywać tab-stop-list ani żadnych insert funkcji:

(custom-set-variables
 '(tab-width 4 't)
 )

Uznałem, że warto dodać to natychmiast po (wskazówka od emacsWiki):

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)
 2
Author: Yary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 17:39:24

Najlepsze odpowiedzi nie zadziałały, dopóki nie napisałem tego w .plik emacs:

(global-set-key (kbd "TAB") 'self-insert-command)
 1
Author: user1009285,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-29 19:57:35

Jest to jedyne rozwiązanie, które zapobiega wstawianiu tabulatora, bez sekwencji lub konwersji tabulatorów na spacje. Oba wydawały się odpowiednie, ale marnotrawne: {]}

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

Zauważ, że quote potrzebuje dwóch liczb do działania (ale nie więcej!).

Ponadto, w większości głównych trybów (na przykładPython), wcięcie jest automatyczne w Emacsie. Jeśli potrzebujesz wcięcia poza Auto indent, użyj:

na-i

 1
Author: ryanpcmcquen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 23:15:24

Czy próbowałeś

(setq  tab-width  4)
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 07:10:20
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
 0
Author: Dason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-30 19:06:52

Przy okazji, dla C-mode dodam (setq-default c-basic-offset 4) za .emacs. Zobacz http://www.emacswiki.org/emacs/IndentingC po szczegóły.

 0
Author: flyrain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-19 06:11:05

Z mojego pliku init, inny, bo chciałem spacje zamiast tabulatorów:


(add-hook 'sql-mode-hook
          (lambda ()
             (progn
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (setq indent-line-function 'tab-to-tab-stop) 
               (modify-syntax-entry ?_ "w")       ; now '_' is not considered a word-delimiter
               (modify-syntax-entry ?- "w")       ; now '-' is not considered a word-delimiter 
               )))
 0
Author: forkandwait,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 14:30:46