Całkowicie wyłącz wszystkie automatyczne wcięcia

18

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-modena nilnie 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 lpo 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
Pan Fooz
źródło
Ponieważ niektóre zmienne związane z wcięciami są lokalne dla bufora, musiałoby istnieć coś, co uruchomi się po przechwyceniu trybu głównego - np. Może [?] hack-local-variables-hook- aby zasadniczo cofnąć to, co inne główne tryby ustawiły jako część ich standardowa inicjalizacja. fundamental-modejest tylko małą funkcją w środku simple.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.
prawnik
Czy emacs ma odpowiednik vima :set paste? To w zasadzie mówi „nie dotykaj wklejonego tekstu w jakikolwiek sposób”. Który obejmuje również automatyczne wcięcie.
Omair Majid,

Odpowiedzi:

21

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 RETklucz (w rzeczywistości RET 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 poleceniem newline-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-jz newline(tak jak RET).

(global-set-key "\C-j" 'newline)

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 interaktywnie M-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.

Gilles „SO- przestań być zły”
źródło
electric-indent-modejest 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-modenie jest dla mnie dostępny przez M-x. Pomoc na RETwymienia trzy ustawienia: use-hard-newlines, auto-fill-function, i fill-column. Przełączanie lub modyfikowania tych urządzeń M-x use-hard-lines, M-x auto-fill-modei M-x set-fill-column RET 0 RETnie pomagają.
Pan Fooz,
@MrFooz Och, przepraszam, nie zwróciłem uwagi na wersję Emacsa w twoim pytaniu. Ale zastanawiam się, dlaczego dostajesz automatyczne wcięcie. Hmmm. Czy otrzymujesz automatyczne wcięcie emacs -q? Wklej krótki tekst zawierający nowy wiersz (powiedz foonewline bar) do Emacsa i naciśnij C-h l, co widzisz? … f o o RET b a rlub … f o o C-j b a rczy … f o o RET C-j barcoś innego? W jakim terminalu uruchamiasz klienta SSH?
Gilles 'SO - przestań być zły'
Dodałem przykładowy tekst do oryginalnego postu. Dodawanie -qnie pomaga (np emacs -q -nw --no-desktop.). Widzę C-jzamiast RET. Używam PuTTY 0.63 jako mojego klienta SSH. Widzę to samo zachowanie z TERMustawionymi na screeni xterm.
Pan Fooz
@MrFooz Ok, ponieważ PuTTY wysyła LF zamiast CR, musisz poinstruować Emacsa, aby nie wciskał LF. Łatwo to wyłączyć na całym świecie, zredagowałem swoją odpowiedź.
Gilles „SO- przestań być zły”
Dzięki, global-set-keywłamanie naprawiło problem. Wymyślę sposób skonfigurowania moich EDITORaliasó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.
Pan Fooz
1

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-pastektó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 emacsa M-x.

db48x
źródło