Desative completamente toda a indentação automática

18

Como desativo completamente toda a indentação automática no Emacs? Preciso desabilitá-lo pelo menos para o modo Fundamental, mas estou bem com ele sendo desabilitado globalmente para a sessão atual.

Por favor, leia o restante desta pergunta antes de declarar uma duplicata. Todas as outras respostas que encontrei são para uma desativação muito mais direcionada do recuo. Eu realmente quero desativar completamente todo o recuo automático durante toda a sessão.

Definir electric-layout-modepara nilnão funciona.

Detalhes

Às vezes, gosto de compor grandes mensagens de confirmação do Git com meu editor de texto ASCII do Windows. Essas mensagens freqüentemente têm listas de marcadores, blocos de código ou outras coisas em que a formatação precisa no meu documento de origem é significativa. Minha base de código está no Linux e eu me conecto à caixa usando um cliente SSH somente texto. Quando o Git entra no Emacs para editar a mensagem de confirmação, quero poder copiar a mensagem de confirmação de origem na área de transferência do Windows e colá-la usando os comandos de colar do Windows. Da perspectiva do Emacs, estou digitando o que foi encontrado no arquivo de texto do Windows. Infelizmente, quando o Emacs vê linhas recuadas, ele adiciona sua própria indentação automática, então recebo esse enorme triângulo de espaços em branco ao longo da borda esquerda do buffer.

Estou usando o GNU Emacs 24.3.1.

Gambiarra

Minha solução atual é transferir meu arquivo de texto do Windows para um sistema de arquivos montado pelo meu host Linux, carregar o arquivo no Emacs e usar kill e yank para transferir o conteúdo. Isso é um pouco desajeitado.

Exemplo

Aqui está um exemplo de bloco de texto:

a

  - b
    c
    d

Aqui está como aparece quando colo isso no Emacs-under-ssh através da pasta MSWin:

a

  - b
      c
          d

Se eu pressionar C-h ldepois de colar, eis o que vejo. Observe que as novas linhas são inseridas usando C-j, não 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
Mr Fooz
fonte
Como algumas das variáveis ​​relacionadas ao recuo são locais de buffer, seria necessário executar algo após o gancho do modo principal - por exemplo, talvez [?] hack-local-variables-hook- para desfazer essencialmente o que outros modos principais configuram como parte de seu inicialização padrão. fundamental-modeé apenas uma pequena função interna simple.el- ou seja (kill-all-local-variables) (run-mode-hooks),. M-x find-function RET fundamental-mode RET- você pode modificar / criar o seu próprio, conforme necessário; no entanto, se você alterar o nome, ele não será usado por algumas funções - portanto, considere manter o mesmo nome.
lawlist
O emacs tem um equivalente ao vim :set paste? Isso basicamente diz "não toque no texto colado de forma alguma". O que também inclui recuo automático.
Omair Majid

Respostas:

21

Emacs ≤24,3

Pressionar RET não recua por padrão (exceto em alguns modos de programação, para os quais você precisa verificar a configuração específica do modo, por exemplo, configurações “elétricas”).

Os terminais Unix normalmente colam um caractere de retorno de carro quando o conteúdo da área de transferência contém uma nova linha (representada pelo caractere de alimentação de linha). No Emacs, um retorno de carro se parece com a RETchave (na verdade, RET é o caractere de retorno de carro), enquanto um feed de linha se parece com (é) C-j.

No entanto, no seu caso, colar uma nova linha resulta em a C-j, que no Emacs está vinculado ao comando newline-and-indent. Como o nome indica, este comando recua. Não sei se o PuTTY tem uma configuração que você pode alterar. Se você deseja corrigir o problema no final do Emacs, há uma solução fácil que eu acho que você não vai se importar: ligar C-jpara newline(o mesmo que RET).

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

Emacs ≥24,4

No Emacs 24.4, o modo de avanço elétrico é ativado por padrão. É um modo secundário global, para que você possa desativá-lo em qualquer lugar chamando (electric-indent-mode 0)e alterná-lo interativamente M-x electric-indent-mode RET.

Você pode encontrar essas informações no manual ou consultando a documentação do comando chamado pressionando Return(pressione C-h k RET).

Você pode ativá-lo em um buffer específico com electric-indent-local-mode. Alguns modos de programação (especialmente os de terceiros) podem ter seus próprios recursos de recuo automático que não seguem as configurações do modo Recuo elétrico.

Gilles 'SO- parar de ser mau'
fonte
electric-indent-modeestá desativado por padrão (isso é consistente com o que você disse porque estou usando o Emacs 24.3.1). Ativá-lo e desativá-lo não ajuda. electric-indent-local-modenão está disponível para mim via M-x. Ajuda on RETmenciona três configurações: use-hard-newlines, auto-fill-function, e fill-column. Alternando ou modificar os via M-x use-hard-lines, M-x auto-fill-modee M-x set-fill-column RET 0 RETnão ajuda.
Mr Fooz
@ MrFooz Oh, desculpe, eu não tinha prestado atenção à versão do Emacs na sua pergunta. Mas então eu me pergunto por que você está recebendo recuo automático. Hummm. Você recebe recuo automático emacs -q? Por favor, cole um texto breve contendo uma nova linha (digamos foonova linha bar) no Emacs e pressione C-h l, o que você vê? … f o o RET b a rou … f o o C-j b a rou … f o o RET C-j barou algo mais? Em que terminal você executa o cliente SSH?
Gilles 'SO- stop be evil'
Adicionei um exemplo de sinopse de texto à postagem original. Adicionar -qnão ajuda (por exemplo emacs -q -nw --no-desktop). Eu vejo em C-jvez de RET. Estou usando o PuTTY 0.63 como meu cliente SSH. Eu vejo o mesmo comportamento com TERMdefinido como screene xterm.
Mr Fooz
@MrFooz Ok, como o PuTTY está enviando um LF em vez de um CR, você precisa instruir o Emacs a não recuar em um LF. É fácil desativar globalmente; editei minha resposta.
Gilles 'SO- stop be evil'
Obrigado, o global-set-keyhack corrigiu o problema. Vou descobrir uma maneira de configurar meus EDITORaliases para invocá-lo automaticamente na inicialização ao editar mensagens de confirmação do Git. Novas linhas estão sendo coladas em vez de retornos de carro, porque eu configurei meu editor de texto favorito do Windows para usar as terminações de linha no estilo UNIX em vez das no Windows.
Sr. Fooz
1

Você também pode tentar o modo de colar entre colchetes. Esse é um recurso do emulador de terminal (PuTTY, neste caso, versões 0.63 e posteriores), que usa seqüências de escape para sinalizar que o usuário está colando algo e, em seguida, novamente quando a pasta termina. Há um pacote Emacs chamado bracketed-pasteque você pode instalar, ele permite que o Emacs reconheça as seqüências de escape e faça a transição para um mapa de teclas mais seguro pela duração da colagem. Isso não apenas impede que o recuo seja confuso, como também impede que uma pasta não autorizada execute comandos na sua sessão do emacs M-x.

db48x
fonte