Ustaw 4 wcięcia spacji w Emacsie w trybie tekstowym

159

Nie udało mi się zmusić Emacsa do przełączania się z 8 spacji na 4 spacje po naciśnięciu TABbuforów w trybie 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ę .emacsplik (lub zmienne lokalne mojego bufora), TABprzycisk zawsze robi to samo.

  1. Jeśli powyżej nie ma tekstu, wcięcie 8 spacji
  2. Jeśli w poprzednim wierszu znajduje się tekst, użyj wcięcia na początku drugiego słowa

Tak bardzo jak kocham Emacsa, to robi się irytujące. Czy istnieje sposób, aby Emacs wprowadził co najmniej 4 wcięcie spacji, gdy w poprzednim wierszu nie ma tekstu?

Cristian
źródło
Dla linii trybu C ++ lub csharp-mode dodałem (setq tab-width 4) (setq c-basic-offset 4) na końcu (defun csharp-mode () ...) i udało się zrobić ( 1) tabulatory są wyświetlane jako 4 zamiast 8 znaków i (2) kiedy naciskam tabulator, otrzymuję 4 spacje w nowym wierszu.
Jared Updike
Bardzo późno, ale właśnie zdałem sobie sprawę, że użycie (setq tab-width 4) nie działa, ale jeśli używasz (setq-default tab-width 4), nie musisz robić nic więcej.
Sambatyon
Zobacz moją odpowiedź, jeśli chcesz użyć spacji, ale przejdź do tabulatorów.
widelec i czekać
Uwaga dla innych, którzy znaleźli to pytanie: (setq-default tab-width 4)NIE jest tym samym, co (setq tab-width 4)upewnij się, że nie przegapiłeś opcji „-default”!
zachaysan
10
Nie mogę uwierzyć, że jest to takie trudne.
gwg

Odpowiedzi:

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

lub dodaj pozycję listy tabulacji do zmiennych zestawu niestandardowego w pliku .emacs :

(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))))
Bert F.
źródło
9
Potrzebne są zarówno tabulatory, jak i tabulatory. tab-width jest używana, gdy WYŚWIETLASZ tabulatory, podczas gdy tab-stop-list jest potrzebna do określenia tabulatorów, gdy dodajesz tabulatory.
Michael Ratanapintha,
3
Zwróć uwagę na stackoverflow.com/questions/69934/…
phils
5
Czy naprawdę nie ma nic krótszego niż '(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)))? Tak długo, jak to działa, chyba ...: P
HelloGoodbye,
5
Zgodnie z dokumentacją nie potrzebujesz wszystkich tych stanowisk. Po prostu zrób 4 8 12, a rozszerzy się na wszystkie inne (dodawaj 4). Najwyraźniej jeśli użyjesz tylko 1 lub 2 elementów zamiast 3, użyje tylko szerokości tabulacji jako ostatniego kroku. Więc teoretycznie, gdybym chciał tabulować o cztery spacje, a moja szerokość tabulacji była ustawiona na 4. Mógłbym pisać '(tab-stop-list (quote (4))).
Nicholas Peterson
1
@NicholasPeterson dziękuję, że to zauważyłeś! Wydawałoby się jednak, że w praktyce quotedo kontynuowania ciągu w nieskończoność potrzebne są dwie liczby. Zobacz: stackoverflow.com/a/42148697/2662028
ryanpcmcquen
138

Krótka odpowiedź:

Kluczową kwestią jest powiedzenie emacsowi, aby wstawiał cokolwiek chcesz podczas wcięcia, odbywa się to poprzez zmianę funkcji indent-line-function. Łatwiej jest to zmienić, aby wstawić tabulator, a następnie zamienić tabulatory na 4 spacje, niż zmienić, aby wstawić 4 spacje. Następująca 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 instrukcji Indentation Controlled by Major Mode @ emacs :

Ważną funkcją każdego głównego trybu jest dostosowanie klawisza do odpowiedniego wcięcia dla edytowanego języka.

[…]

Zmienna indent-line-function to funkcja, która ma być używana przez (i różne polecenia, na przykład podczas wywoływania indent-region) w celu wcięcia bieżącego wiersza. Polecenie wcięcie według trybu nie robi nic poza wywołaniem tej funkcji.

[…]

W wielu trybach wartość domyślna jest zależna od wcięcia.

Z podręcznika @ emacs względnego wcięcia:

Względne wcięcie Spacja do następnego punktu wcięcia w poprzedniej niepustej linii.

[…]

Jeśli poprzednia niepusta linia nie ma punktów wcięcia poza punktem zaczynającym się od kolumny, zamiast tego wykonywany jest `tab-to-tab-stop '.

Po prostu zmień wartość indent-line-function na funkcję insert-tab i skonfiguruj wstawianie tabulatorów jako 4 spacje.

alcortes
źródło
10
Mam ten sam problem co OP, Twoje rozwiązanie nie działa u mnie.
Gauthier
Proszę, omówcie dalej. Czy masz na myśli to, że użycie powyższych wierszy jako jedynej zawartości pliku .emacs i wywołanie „Mx wcięcie według trybu” nie spowoduje wstawienia 4 spacji?
alcortes
3
Twoja konfuguracja wstawia dla mnie 8 spacji.
Vladimir Mihailenco
4
Używam emacsa w wersji 23.3.1 i krótka odpowiedź nie zmienia go na spacje. ta odpowiedź jest myląca.
VNarasimhaM
2
@BruceBarnett Jestem w trybie tekstowym i te instrukcje nadal nie działają.
słoneczny
66

Aktualizacja: Od wersji 24.4 Emacsa:

tab-stop-listjest teraz pośrednio rozciągnięta do nieskończoności. Jego domyślna wartość jest zmieniana na, nilco oznacza tabulator zatrzymujący każdą tab-widthkolumnę.

co oznacza, że ​​nie ma już potrzeby ustawiania tab-stop-listw sposób pokazany poniżej, ponieważ możesz to ustawić nil.

Oryginalna odpowiedź jest następująca ...


Zawsze trochę mnie boli, (setq tab-stop-list 4 8 12 ................)gdy widzę takie rzeczy, jak sytuacja, gdy number-sequencefunkcja siedzi tam i 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))
phils
źródło
To jedyna odpowiedź, jaką mogłem dostać do pracy w moim systemie.
Karpov,
Strona dostosowywania wcięć w emacsie mówi, że lista zakładek "niejawnie rozciąga się do nieskończoności poprzez powtórzenie ostatniego kroku" - co oznacza, że ​​lista (4 8) powinna być wystarczająco dobra, bez jawnej sekwencji liczb
James Waldby - jwpat7
@ JamesWaldby-jwpat7 Rzeczywiście, stało się to w 24.4 (2014). NEWS mówi: " tab-stop-listjest teraz niejawnie rozszerzony do nieskończoności. Jego domyślna wartość jest zmieniona na zero, co oznacza tabulator na każdej tab-widthkolumnie." - więc w rzeczywistości możesz po prostu użyć domyślnej wartości nil.
phils
21

Konfigurowanie kart może być łatwiejsze w następujący sposób:

M-x customize-group

Po Customize group:monicie wprowadź indent.

Zobaczysz ekran, na którym możesz ustawić wszystkie opcje wcięć 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 dostosowań .

Dave Webb
źródło
Muszę pamiętać o dostosowaniu grupy Mx - bardzo przydatny skrót!
Nick Bolton,
11
(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)

źródło
10
(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)
lista prawników
źródło
To działało dla mnie, gdy inni na tej stronie nie.
Michael Terry,
Działa w emacs26.3
Saurabh
9
(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)

działa to dla kodu C ++ i komentarza w środku

user2318996
źródło
Spóźniony na przyjęcie, ale dziękuję. Nie mogę pojąć, dlaczego emacs potrzebowałby konkretnych instrukcji, aby zastosować swoje reguły wcięć również do kodu C / C ++. W przyszłości będę przyglądał się
Vimowi
Chcę sobie zadać to pytanie, TYLKO TAK MOGĘ ZAAKCEPTOWAĆ TĘ ODPOWIEDŹ. Dałbym za to nagrodę, gdybym mógł. Byłem bardzo, bardzo zdenerwowany, że zmiana sprawiła, że ​​emacs nie chciał wejść na kartę na 4, przeszedł przez wszystkie rozwiązania na tej stronie i zaoszczędziłeś mi ogromną ilość pracy!
Sortowanie topologiczne
7

Ten problem nie jest spowodowany brakującymi tabulatorami; chodzi o to, że emacs ma (nową?) metodę tabulacji zwaną wcięciem względnym, która wydaje się być zaprojektowana do wyrównywania danych tabelarycznych. Klawisz TAB jest mapowany na metodę indent-for-tab-command, która wywołuje dowolną metodę, na którą ustawiono zmienną indent-line-function, czyli metodę względną wcięcia dla trybu tekstowego. Nie znalazłem dobrego sposobu na przesłonięcie zmiennej indent-line-function (hak trybu tekstowego nie działa, więc może jest resetowany po uruchomieniu haków trybu?), Ale jeden prosty sposób na pozbycie się tego zachowaniem jest po prostu odrzucenie metody intent-for-tab-command, ustawiając TAB na prostszą metodę tab-to-tab-stop:

(zdefiniuj-klawisz-map-trybu-tekstu (kbd "TAB") 'tab-to-tab-stop)


źródło
6

Spróbuj tego:

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

To spowoduje, że TAB zawsze wstawi literalny znak TAB z tabulatorami co 4 znaki (ale tylko w trybie tekstowym). Jeśli nie o to prosisz, opisz zachowanie, które chciałbyś zobaczyć.

cjm
źródło
4
Myślę, że OP chce spacji zamiast tabulatorów (więc naciśnięcie Tab wstawia 4 spacje).
mipadi
W połączeniu z Aquamacs 2.4 ta konkretna odpowiedź daje mi znaki w innym języku zamiast tabulatora: 렔. Jeśli klawisz tabulatora zostanie naciśnięty więcej niż jeden raz, wynikiem jest: 렔렔 (bez separacji). To samo dotyczy każdego kolejnego naciśnięcia klawisza.
lista prawników
6

Możesz dodać te wiersze kodu do swojego pliku .emacs. Dodaje hak dla trybu tekstowego, aby używać tabulacji wstawiania zamiast wcięcia względnego.

(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.

gigilibala
źródło
4

Wystarczyła mi zmiana stylu na c-set-style.

dzielony przez zero
źródło
4

Dodaj to do swojego pliku .emacs:

Spowoduje to ustawienie szerokości wyświetlanej karty na 2 znaki (zmień liczbę 2 na dowolną)

(setq default-tab-width 2)

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

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

Nawiasem mówiąc, domyślnym ustawieniem emacsa podczas cofania się po tabulacji jest konwersja na spacje, a następnie usunięcie spacji. To może być denerwujące. Jeśli chcesz, aby po prostu usunął kartę, możesz to zrobić:

(setq c-backspace-function 'backward-delete-char)

Cieszyć się!

qwerty9967
źródło
Nie spełnia co najmniej 4 spacji zadanych w pytaniu.
kmarsh
2

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))
)

Zwróć uwagę, że do działania quotepotrzebne są dwie liczby (ale nie więcej!).

Ponadto, w większości głównych trybów ( Pythonna przykład), wcięcia są automatyczne w Emacsie. Jeśli potrzebujesz wcięcia poza automatyczne wcięcie, użyj:

M-i

ryanpcmcquen
źródło
2

Dostosowania mogą być cieniem, (setq tab width 4)więc użyj setq-defaultlub poinformuj Dostosowywanie, co robisz. Miałem również problemy podobne do OP i naprawiłem je sam, nie musiałem dostosowywać tab-stop-listani żadnych insertfunkcji:

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

Okazało się, że warto dodać to natychmiast po (wskazówka z emacsWiki):

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)
Yary
źródło
1

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

(global-set-key (kbd "TAB") 'self-insert-command)
user1009285
źródło
0

Czy próbowałeś

(setq  tab-width  4)

źródło
2
Mają to w swoim pytaniu, więc tak, można bezpiecznie założyć, że próbowali.
ryanpcmcquen
0
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
Dason
źródło
0

Z mojego pliku init, inny, ponieważ 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) 
               (modyfikuj-składnię-wpis? _ "w"); teraz „_” nie jest uważany za separator słów
               (modyfikacja-składni-wpisu? - "w"); teraz „-” nie jest uważany za separator wyrazów
               )))
forkandwait
źródło
0

Zmodyfikowano tę odpowiedź bez żadnego haka:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Saurabh
źródło