Definir 4 recuo de espaço no Emacs no modo de texto

159

Não consegui fazer com que o Emacs alternasse de 8 guias de espaço para 4 guias de espaço ao pressionar os TABbuffers no modo principal text-mode. Adicionei o seguinte ao meu .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)

Não importa como eu mude meu .emacsarquivo (ou as variáveis ​​locais do meu buffer), o TABbotão sempre faz a mesma coisa.

  1. Se não houver texto acima, indente 8 espaços
  2. Se houver texto na linha anterior, recue no início da segunda palavra

Por mais que eu ame o Emacs, isso está ficando chato. Existe uma maneira de fazer o Emacs recuar pelo menos 4 espaços quando não houver texto na linha anterior?

Cristian
fonte
Para uma linha de modo C ++ ou modo csharp, adicionei (setq tab-width 4) (setq c-basic-offset 4) ao final de (defun csharp-mode () ...) e ele fez o truque para fazer ( 1) as guias são exibidas como 4 em vez de 8 caracteres e (2) quando pressiono a guia, recebo 4 espaços em uma nova linha.
Jared Updike
Muito tarde, mas acabei de perceber que usar (setq tab-width 4) não funciona, mas se você usar (setq-default tab-width 4) não precisará fazer mais nada.
Sambatyon
Veja minha resposta se você quiser usar espaços, mas vá para as paradas de tabulação.
Fork1 #
Nota para outras pessoas que encontraram esta pergunta: (setq-default tab-width 4)NÃO é a mesma coisa (setq tab-width 4)que você não perdeu o "padrão"!
zachaysan
10
Não acredito que isso seja tão difícil de fazer.
gwg

Respostas:

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

ou adicione a entrada tab-stop-list às variáveis ​​de conjunto personalizadas no arquivo .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
fonte
9
São necessárias largura da guia e lista de interrupção de tabulação. tab-width é usada quando DISPLAYING tabs, enquanto tab-stop-list é necessário para determinar paradas de tabulação quando você ADICIONAR tabs.
Michael Ratanapintha 16/09/08
5
Existe realmente nada mais curto que '(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)))? Bem, desde que funcione, eu acho ...: P
HelloGoodbye
5
De acordo com a documentação, você não precisa de todas essas posições. Faça 4 8 12 e ele se estenderá a todos os outros (continue adicionando 4). Aparentemente, se você usar apenas 1 ou 2 elementos em vez de 3, ele usará a largura da guia como a última etapa. Então, teoricamente, se eu quisesse tabular por quatro espaços e minha largura de tabulação estivesse em 4. Eu poderia escrever '(tab-stop-list (quote (4))).
Nicholas Peterson
1
@NicholasPeterson obrigado por perceber isso! Parece, porém, que na prática quoteprecisa de dois números para continuar a sequência ad infinitum. Veja: stackoverflow.com/a/42148697/2662028
ryanpcmcquen
138

Resposta curta:

O ponto principal é dizer ao emacs para inserir o que você quiser ao recuar, isso é feito alterando a função da linha de recuo. É mais fácil alterá-lo para inserir uma guia e depois alterar as guias em 4 espaços do que alterá-lo para inserir 4 espaços. A seguinte configuração resolverá seu problema:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

Explicação:

No manual do recuo controlado pelo modo principal @ emacs :

Uma função importante de cada modo principal é personalizar a tecla para recuar adequadamente para o idioma que está sendo editado.

[...]

A variável de função indent-line-line é a função a ser usada por (e vários comandos, como ao chamar a região de indentação) para indentar a linha atual. O comando recuar de acordo com o modo não chama mais que esta função.

[...]

O valor padrão é relativo ao recuo para muitos modos.

No manual recuo-relativo @ emacs:

Espaço relativo ao recuo para fora do próximo ponto de recuo na linha anterior não vazia.

[...]

Se a linha não vazia anterior não tiver pontos de indentação além do ponto em que a coluna começa, `tab-to-tab-stop 'é feito.

Apenas altere o valor da função de recuo da linha para a função de inserção de guias e configure a inserção de guias como 4 espaços.

Alcortes
fonte
10
Eu tenho o mesmo problema que o OP, sua solução não funciona para mim.
Gauthier
Por favor, elabore mais. Você quer dizer que usar as linhas acima como o único conteúdo do seu .emacs e chamar "Mx recuo conforme o modo" não inserirá 4 espaços?
alcortes
3
sua confuguração insere 8 espaços para mim.
Vladimir Mihailenco
4
Estou usando o emacs versão 23.3.1 e a resposta curta não o altera para espaços. esta resposta é enganosa.
VNarasimhaM
2
@BruceBarnett Estou no modo de texto e essas instruções ainda não funcionam.
ensolarado
66

Atualização: Desde o Emacs 24.4:

tab-stop-listagora é implicitamente estendido ao infinito. Seu valor padrão é alterado para o nilque significa que uma guia para todas as tab-widthcolunas.

o que significa que não é mais necessário configurar tab-stop-listda maneira mostrada abaixo, pois você pode mantê-lo definido nil.

A resposta original segue ...


Sempre me dói ver coisas como (setq tab-stop-list 4 8 12 ................)quando a number-sequencefunção está lá esperando para ser usada.

(setq tab-stop-list (number-sequence 4 200 4))

ou

(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
fonte
Esta é a única resposta que eu poderia trabalhar no meu sistema.
Karpov
emacs página Personalizar travessão diz lista guia "estende-se implicitamente ao infinito através da repetição da última etapa" - o que significa uma lista (4 8) deve ser bom o suficiente, sem número de seqüência explícita
James Waldby - jwpat7
@ JamesWaldby-jwpat7 De fato, isso aconteceu em 24.4 (2014). O NEWS diz: " tab-stop-listagora está implicitamente estendido ao infinito. Seu valor padrão é alterado para zero, o que significa que uma guia para todas as tab-widthcolunas". - portanto, você pode simplesmente usar o valor padrão de nil.
phils
21

Você pode achar mais fácil configurar suas guias da seguinte maneira:

M-x customize-group

No Customize group:prompt, digite indent.

Você verá uma tela na qual poderá definir todas as opções de recuo e defini-las para a sessão atual ou salvá-las para todas as sessões futuras.

Se você fizer isso dessa maneira, desejará configurar um arquivo de personalização .

Dave Webb
fonte
Eu preciso lembrar o Mx customize-group - atalho muito útil!
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)

fonte
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 de leis
fonte
Isso funcionou para mim quando outras pessoas nesta página não.
Michael Terry
Funciona no 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)

isso funciona para código C ++ e o comentário dentro também

user2318996
fonte
Tarde da festa, mas obrigado. Não consigo entender por que o emacs precisaria de instruções específicas para aplicar suas regras de indentação também ao código C / C ++. Eu estarei de olho no vim no futuro ...
MegaWidget 9/18
Eu mesmo quero fazer essa pergunta, para que eu possa aceitar essa resposta. Eu daria uma recompensa se pudesse. Fiquei muito, muito chateado por uma mudança que o emacs não quis abater às 4, estava passando por todas as soluções desta página, e você me salvou uma quantidade enorme de trabalho!
Classificação topológica
7

Esse problema não é causado pela falta de paradas de tabulação; é que o emacs tem um método de guia (novo?) chamado recuo-relativo que parece projetado para alinhar dados tabulares. A tecla TAB é mapeada para o método indent-for-tab-command, que chama qualquer método para o qual a variável indent-line-function esteja definida, que é o método relativo ao recuo no modo de texto. Eu não descobri uma boa maneira de substituir a variável de função de linha de recuo (o gancho do modo de texto não está funcionando, então talvez ele seja redefinido após a execução dos ganchos do modo?), Mas uma maneira simples de se livrar disso O comportamento é apenas descartar o método de intenção de tabulação, definindo TAB para o método mais simples de tabulação de tabulação:

(definir chave-texto-modo-mapa (kbd "TAB") 'tab-to-tab-stop)


fonte
6

Tente o seguinte:

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

Isso fará com que o TAB sempre insira um caractere TAB literal com paradas de tabulação a cada 4 caracteres (mas apenas no modo Texto). Se não é isso que você está pedindo, descreva o comportamento que você gostaria de ver.

cjm
fonte
4
Eu acho que o OP quer espaços em vez de guias (então pressionar Tab insere 4 espaços).
Mipadi 12/04/09
Em conjunto com o Aquamacs 2.4, esta resposta específica fornece caracteres em outro idioma, em vez de uma guia: 렔. Se a tecla Tab for pressionada mais de uma vez, o resultado é: 렔렔 (sem nenhuma separação). E o mesmo vale para cada pressionamento sucessivo da guia.
lawlist
6

Você pode adicionar essas linhas de código ao seu arquivo .emacs. Ele adiciona um gancho para o modo de texto usar a guia de inserção em vez de relativa ao recuo.

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

Espero que ajude.

gigilibala
fonte
4

Apenas mudar o estilo com c-set-style foi o suficiente para mim.

divida por zero
fonte
4

Adicione isso ao seu arquivo .emacs:

Isso definirá a largura em que uma guia é exibida para 2 caracteres (altere o número 2 para o que você quiser)

(setq default-tab-width 2)

Para garantir que o emacs esteja realmente usando guias em vez de espaços:

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

Além disso, o padrão para o emacs ao retroceder sobre uma guia é convertê-lo em espaços e, em seguida, excluir um espaço. Isso pode ser irritante. Se você quiser apenas excluir a guia, faça o seguinte:

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

Aproveitar!

qwerty9967
fonte
Não atende aos pelo menos 4 espaços solicitados na pergunta.
kmarsh
2

Essa é a única solução que impede que uma guia seja inserida para mim, sem uma sequência ou conversão de guias em espaços. Ambos pareciam adequados, mas desperdiçadores:

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

Observe que quoteprecisa de dois números para funcionar (mas não mais!).

Além disso, na maioria dos modos principais ( Pythonpor exemplo), o recuo é automático no Emacs. Se você precisar recuar fora do recuo automático, use:

M-i

ryanpcmcquen
fonte
2

As personalizações podem ser sombreadas, (setq tab width 4)portanto, use setq-defaultou informe ao Custom o que você está fazendo. Eu também tive problemas semelhantes ao OP e o consertei sozinho, não precisei ajustar tab-stop-listou executar nenhuma insertfunção:

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

Achei útil adicionar isso imediatamente depois (uma dica do emacsWiki):

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)
Yary
fonte
1

As melhores respostas não funcionaram até que eu escrevi isso no arquivo .emacs:

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

Você tentou

(setq  tab-width  4)

fonte
2
Eles têm isso em sua pergunta, então sim, é seguro assumir que eles tentaram.
Ryanpcmcquen
0
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
Dason
fonte
0

No meu arquivo init, diferente porque eu queria espaços em vez de guias:

(add-hook 'sql-mode-hook
          (lambda ()
             (progn
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (função setq indent-line-function 'tab-to-tab-stop) 
               (entrada de modificação de sintaxe? _ "w"); agora '_' não é considerado um delimitador de palavras
               (modificar-sintaxe-entrada? - "w"); now '-' não é considerado um delimitador de palavras
               )))
forkandwait
fonte
0

Modificou esta resposta sem nenhum gancho:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Saurabh
fonte