Disabilita completamente tutto il rientro automatico


18

Come disabilitare completamente il rientro automatico in Emacs? Devo disabilitarlo almeno per la modalità Fondamentale, ma sto bene disabilitato a livello globale per la sessione corrente.

Si prega di leggere il resto di questa domanda prima di dichiararla duplicata. Tutte le altre risposte che ho trovato sono per la disabilitazione molto più mirata dell'indentazione. Voglio davvero disabilitare completamente tutti i rientri automatici per l'intera sessione.

L'impostazione electric-layout-modesu nilnon funziona.

Dettagli

A volte mi piace comporre messaggi di commit Git di grandi dimensioni con il mio editor di testo ASCII di Windows. Questi messaggi hanno spesso elenchi puntati, blocchi di codice o altre cose in cui la formattazione precisa nel mio documento di origine è significativa. La mia base di codice è su Linux e mi collego al box usando un client SSH di solo testo. Quando Git inserisce Emacs per la modifica del messaggio di commit, voglio essere in grado di copiare il messaggio di commit di origine negli Appunti di Windows, quindi incollarlo usando i comandi Incolla di Windows. Dal punto di vista di Emacs, sto scrivendo ciò che è stato trovato nel file di testo di Windows. Sfortunatamente, quando Emacs vede linee rientrate, aggiunge la propria rientranza automatica, quindi ottengo questo enorme triangolo di spazi bianchi lungo il bordo sinistro del buffer.

Sto usando GNU Emacs 24.3.1.

Soluzione

La mia attuale soluzione è trasferire il mio file di testo di Windows su un filesystem montato dal mio host Linux, caricare il file in Emacs, quindi usare kill e yank per trasferire il contenuto. Questo è un po 'goffo.

Esempio

Ecco un esempio di blocco di testo:

a

  - b
    c
    d

Ecco come appare quando lo incollo in Emacs-under-ssh tramite MSWin paste:

a

  - b
      c
          d

Se premo C-h ldopo aver fatto la pasta, ecco cosa vedo. Si noti che le newline vengono inserite usando C-j, non 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

Dal momento che alcune delle variabili relative al rientro sono buffer-locali, dovrebbe esserci qualcosa che corre dietro l'hook in modalità principale - ad esempio, forse [?] hack-local-variables-hook- per annullare sostanzialmente quali altre modalità principali impostate come parte del loro inizializzazione standard. fundamental-modeè solo una piccola funzione all'interno simple.el- cioè (kill-all-local-variables) (run-mode-hooks). M-x find-function RET fundamental-mode RET- è possibile modificare / creare il proprio secondo necessità; tuttavia, se si modifica il nome, non verrà utilizzato da alcune funzioni, quindi considerare di mantenere lo stesso nome.
elenco delle leggi


Emacs ha un equivalente di VIM :set paste? Questo in pratica dice "non toccare il testo incollato in alcun modo". Che include anche il rientro automatico.
Omair Majid,

Risposte:


21

Emacs ≤24.3

La pressione di RET non rientra di default (tranne in alcune modalità di programmazione, per le quali è necessario verificare la configurazione specifica della modalità, ad es. Impostazioni "elettriche").

I terminali Unix normalmente incollano un carattere di ritorno a capo quando il contenuto degli appunti contiene una nuova riga (rappresentata dal carattere di avanzamento riga). In Emacs, un ritorno a capo appare come la RETchiave (in realtà, RET è il carattere di ritorno a capo), mentre un avanzamento di riga assomiglia (è) C-j.

Tuttavia, nel tuo caso, incollare una nuova riga risulta in a C-j, che in Emacs è associato al comando newline-and-indent. Come indica il nome, questo comando rientra. Non so se PuTTY ha un'impostazione che puoi modificare. Se vuoi risolvere il problema da un punto di vista di Emacs, c'è una soluzione semplice a cui penso non ti dispiacerà: bind C-jto newline(uguale a RET).

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

Emacs ≥24.4

In Emacs 24.4, la modalità rientro elettrico è attivata per impostazione predefinita. È una modalità secondaria globale, quindi puoi disattivarla ovunque chiamando (electric-indent-mode 0)e puoi attivarla in modo interattivo M-x electric-indent-mode RET.

Puoi trovare queste informazioni nel manuale o guardando la documentazione del comando invocato premendo Return(premi C-h k RET).

Puoi accenderlo in un buffer specifico con electric-indent-local-mode. Alcune modalità di programmazione (specialmente quelle di terze parti) possono avere le proprie funzioni di rientro automatico che non seguono le impostazioni della modalità di rientro elettrico.


electric-indent-modeè disabilitato di default (questo è coerente con quello che hai detto perché sto usando Emacs 24.3.1). Attivarlo e disattivarlo non aiuta. electric-indent-local-modenon è disponibile per me tramite M-x. Guida in RETmenziona tre impostazioni: use-hard-newlines, auto-fill-function, e fill-column. Commutazione o la modifica di quelli via M-x use-hard-lines, M-x auto-fill-modee M-x set-fill-column RET 0 RETnon aiutano.
Fooz,

@MrFooz Oh, scusa, non avevo prestato attenzione alla versione di Emacs nella tua domanda. Ma poi mi chiedo perché stai ottenendo il rientro automatico. Hmmm. Riceverai un rientro automatico con emacs -q? Si prega di incollare un breve testo contenente una nuova riga (dire foonuova riga bar) in Emacs e premere C-h l, cosa vedi? … f o o RET b a ro … f o o C-j b a ro … f o o RET C-j baro qualcos'altro? In quale terminale esegui il client SSH?
Gilles 'SO- smetti di essere malvagio' il

Ho aggiunto un esempio di testo al post originale. L'aggiunta -qnon aiuta (ad es emacs -q -nw --no-desktop.). Vedo C-jinvece di RET. Sto usando PuTTY 0.63 come mio client SSH. Vedo lo stesso comportamento con TERMset su screene xterm.
Fooz,

@MrFooz Ok, poiché PuTTY sta inviando un LF piuttosto che un CR, devi istruire Emacs a non rientrare in un LF. È facile da disattivare a livello globale, ho modificato la mia risposta.
Gilles 'SO- smetti di essere malvagio' il

Grazie, l' global-set-keyhack ha risolto il problema. Scoprirò un modo per configurare i miei EDITORalias per invocarlo automaticamente all'avvio durante la modifica dei messaggi di commit di Git. Le nuove righe vengono incollate anziché i ritorni a capo poiché ho configurato il mio editor di testo Windows preferito per utilizzare le terminazioni di linea in stile UNIX anziché quelle di Windows.
Fooz,

1

Potresti anche provare la modalità incolla tra parentesi. Questa è una caratteristica del tuo emulatore di terminale (in questo caso PuTTY, versioni 0.63 e successive) che utilizza sequenze di escape per segnalare che l'utente sta incollando qualcosa, e poi di nuovo quando termina l'incolla. Esiste un pacchetto Emacs chiamato bracketed-pasteche è possibile installare, che consente a Emacs di riconoscere le sequenze di escape e passare a una mappa di tasti più sicura per la durata dell'incollaggio. Questo non solo evita che il rientro si incasini, ma impedisce anche a un incappucciato di eseguire comandi nella sessione di emacs M-x.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.