Jak całkowicie wyłączyć wszystkie automatyczne wcięcia w Emacsie? Muszę go wyłączyć przynajmniej w trybie podstawowym, ale nie przeszkadza mi to, że jest wyłączony globalnie dla bieżącej sesji.
Przeczytaj resztę tego pytania przed zadeklarowaniem duplikatu. Wszystkie pozostałe odpowiedzi, które znalazłem, dotyczą znacznie bardziej ukierunkowanego wyłączenia wcięcia. Naprawdę chcę całkowicie wyłączyć wszystkie automatyczne wcięcia dla całej sesji.
Ustawienie electric-layout-mode
na nil
nie działa.
Detale
Czasami lubię komponować duże wiadomości Git commit w moim edytorze tekstowym ASCII systemu Windows. Wiadomości te często zawierają listy wypunktowane, bloki kodu lub inne rzeczy, w których dokładne formatowanie w moim dokumencie źródłowym ma znaczenie. Moja baza kodów znajduje się w systemie Linux i łączę się z urządzeniem przy użyciu tekstowego klienta SSH. Kiedy Git wprowadza Emacsa w celu edycji wiadomości zatwierdzenia, chcę móc skopiować źródłową wiadomość zatwierdzenia do schowka Windows, a następnie wkleić ją za pomocą poleceń wklejania systemu Windows. Z perspektywy Emacsa piszę to, co znaleziono w pliku tekstowym Windows. Niestety, kiedy Emacs widzi linie wcięcia, dodaje własne automatyczne wcięcie, więc otrzymuję ten ogromny trójkąt białych znaków wzdłuż lewej krawędzi bufora.
Używam GNU Emacs 24.3.1.
Obejście
Moje obecne obejście polega na przeniesieniu pliku tekstowego Windows do systemu plików zamontowanego przez mojego hosta Linux, załadowanie pliku do Emacsa, a następnie użycie kill i yank, aby przenieść zawartość. To jest trochę niezgrabne.
Przykład
Oto przykładowy blok tekstu:
a
- b
c
d
Oto jak to wygląda, kiedy wklejam to do Emacsa-under-ssh przez MSWin paste:
a
- b
c
d
Jeśli nacisnę C-h l
po zrobieniu pasty, oto co widzę. Zauważ, że znaki nowej linii są wprowadzane za pomocą C-j
, a nie RET
.
a C-j C-j SPC SPC - SPC b C-j SPC SPC SPC SPC c C-j
SPC SPC SPC SPC d C-j C-h l
źródło
hack-local-variables-hook
- aby zasadniczo cofnąć to, co inne główne tryby ustawiły jako część ich standardowa inicjalizacja.fundamental-mode
jest tylko małą funkcją w środkusimple.el
- tj(kill-all-local-variables) (run-mode-hooks)
.M-x find-function RET fundamental-mode RET
- możesz modyfikować / tworzyć własne według potrzeb; jeśli jednak zmienisz nazwę, niektóre funkcje nie będą z niej korzystać - rozważ więc zachowanie tej samej nazwy.:set paste
? To w zasadzie mówi „nie dotykaj wklejonego tekstu w jakikolwiek sposób”. Który obejmuje również automatyczne wcięcie.Odpowiedzi:
Emacs ≤ 24,3
Naciśnięcie klawisza RET domyślnie nie powoduje wcięcia (z wyjątkiem niektórych trybów programowania, dla których należy sprawdzić konfigurację zależną od trybu, np. Ustawienia „elektryczne”).
Terminale uniksowe zwykle wklejają znak powrotu karetki, gdy zawartość schowka zawiera nowy wiersz (reprezentowany przez znak przesunięcia wiersza). W Emacsie znak powrotu karetki wygląda jak
RET
klucz (w rzeczywistościRET
jest znakiem powrotu karetki), podczas gdy znak wiersza wygląda jak (jest)C-j
.Jednak w twoim przypadku wklejenie nowego wiersza powoduje utworzenie znaku
C-j
, który w Emacsie jest związany z poleceniemnewline-and-indent
. Jak wskazuje nazwa, to polecenie wcina się. Nie wiem, czy PuTTY ma ustawienie, które możesz zmienić. Jeśli chcesz naprawić problem po stronie Emacsa, istnieje łatwe obejście, które, jak sądzę, nie będzie ci przeszkadzać: powiążC-j
znewline
(tak jakRET
).Emacs ≥24.4
W Emacsie 24.4 tryb wcięcia elektrycznego jest domyślnie włączony. Jest to globalny tryb podrzędny, więc możesz go wyłączyć wszędzie, dzwoniąc
(electric-indent-mode 0)
i możesz przełączać go interaktywnieM-x electric-indent-mode RET
.Informacje te można znaleźć w instrukcji lub przeglądając dokumentację polecenia wywołanego przez naciśnięcie Return(naciśnij
C-h k RET
).Możesz włączyć go w określonym buforze za pomocą
electric-indent-local-mode
. Niektóre tryby programowania (szczególnie zewnętrzne) mogą mieć własne funkcje automatycznego wcięcia, które nie są zgodne z ustawieniami trybu Electric Indent.źródło
electric-indent-mode
jest domyślnie wyłączone (jest to zgodne z tym, co powiedziałeś, ponieważ używam Emacsa 24.3.1). Włączanie i wyłączanie nie pomaga.electric-indent-local-mode
nie jest dla mnie dostępny przezM-x
. Pomoc naRET
wymienia trzy ustawienia:use-hard-newlines
,auto-fill-function
, ifill-column
. Przełączanie lub modyfikowania tych urządzeńM-x use-hard-lines
,M-x auto-fill-mode
iM-x set-fill-column RET 0 RET
nie pomagają.emacs -q
? Wklej krótki tekst zawierający nowy wiersz (powiedzfoo
newlinebar
) do Emacsa i naciśnijC-h l
, co widzisz?… f o o RET b a r
lub… f o o C-j b a r
czy… f o o RET C-j bar
coś innego? W jakim terminalu uruchamiasz klienta SSH?-q
nie pomaga (npemacs -q -nw --no-desktop
.). WidzęC-j
zamiastRET
. Używam PuTTY 0.63 jako mojego klienta SSH. Widzę to samo zachowanie zTERM
ustawionymi nascreen
ixterm
.global-set-key
włamanie naprawiło problem. Wymyślę sposób skonfigurowania moichEDITOR
aliasów, aby automatycznie wywoływały je podczas uruchamiania podczas edytowania komunikatów Git commit. Nowe wiersze są wklejane zamiast zwrotów karetki, ponieważ skonfigurowałem mój ulubiony edytor tekstowy Windows, aby zamiast końcówek Windows używał zakończeń linii w stylu UNIX.Możesz także wypróbować tryb wklejania w nawiasach. Jest to funkcja emulatora terminala (w tym przypadku PuTTY, wersje 0.63 i nowsze), która wykorzystuje sekwencje specjalne do sygnalizowania, że użytkownik coś wkleja, a następnie ponownie, gdy kończy się wklejanie. Istnieje pakiet Emacsa o nazwie,
bracketed-paste
który można zainstalować, pozwala on Emacsowi rozpoznać sekwencje specjalne i przejść do bezpieczniejszej mapy klawiszy na czas wklejania. Zapobiega to nie tylko pomieszaniu wcięcia, ale także zapobiega uruchamianiu przez nieuczciwe polecenia w sesji emacsaM-x
.źródło