ti-enxame.com

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

Eu não tive sucesso em fazer com que o Emacs mudasse de 8 abas de espaço para 4 abas de espaço ao pressionar o botão TAB em buffers com o modo principal text-mode. Eu 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 mudo meu arquivo .emacs (ou as variáveis ​​locais do meu buffer) TAB botã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 do segundo Word

Tanto quanto eu amo o Emacs isso está ficando chato. Existe uma maneira de fazer o Emacs pelo menos recuar 4 espaço quando não há texto na linha anterior?

152
Cristian
(customize-variable (quote tab-stop-list))

ou adicione tab-stop-list entrada para custom-set-variables in . emacs file:

(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))))
28
Bert F

Resposta curta:

O ponto chave é dizer ao emacs para inserir o que você quiser quando recuando, isto é feito mudando a função de linha de recuo. É mais fácil alterá-lo para inserir uma guia e, em seguida, alterar as guias em 4 espaços, em vez de alterá-lo para inserir 4 espaços. A configuração a seguir resolverá seu problema:

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

Explicação:

De Indentação Controlada pelo Modo Principal @ manual emacs :

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

[...]

A variável de função de linha de recuo é a função a ser usada por (e vários comandos, como quando chamando indent-region) para recuar a linha atual. O comando indent-according-to-Mode não faz mais do que chamar essa função.

[...]

O valor padrão é relativo para vários modos.

Do manual indent-relative @ emacs:

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

[...]

Se a linha não vazia anterior não tiver pontos de recuo além do início do ponto de coluna, a opção "tab-to-tab-stop" será feita.

Basta alterar o valor da função de linha de recuo para a função de tabulação de inserção e configurar a inserção da guia como 4 espaços.

132
alcortes

pdate: Desde o Emacs 24.4:

tab-stop-list agora está implicitamente estendido ao infinito. Seu valor padrão é alterado para nil, o que significa uma parada de tabulação em todas as colunas tab-width.

o que significa que não há mais necessidade de configurar tab-stop-list da maneira mostrada abaixo, pois você pode mantê-lo definido como nil.

A resposta original segue ...


É sempre doloroso ver coisas como (setq tab-stop-list 4 8 12 ................) quando a função number-sequence está parada 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))
65
phils

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

M-x customize-group

No prompt Customize group:, digite indent.

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

Se você fizer isso, você vai querer configurar um arquivo de personalizações .

21
Dave Webb
(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)
11
Yan Li
(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 o código C++ e o comentário dentro também

9
user2318996
(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)
9
lawlist

Esse problema não é causado por paradas de tabulação ausentes; é que o emacs tem um método de tabulação (novo?) chamado indent-relative 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, o que é um método relativo a indent para o modo de texto. Eu não descobri uma boa maneira de substituir a variável de função de linha de recuo (o gancho de modo de texto não está funcionando, então talvez esteja sendo redefinido depois que os ganchos de modo forem executados?), Mas uma forma simples de se livrar disso O comportamento é apenas eliminar o método intent-for-tab-command definindo o TAB como o método mais simples de tab-to-tab-stop:

(tecla de definição de texto-modo-mapa (kbd "TAB") 'tab-to-tab-stop)

7
Glenn

Tente isto:

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

6
cjm

Você pode adicionar essas linhas de código ao seu arquivo .emacs. Ele adiciona um gancho para o modo de texto para usar a tabulação 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.

6
gigilibala

Adicione isto ao seu arquivo .emacs:

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

(setq default-tab-width 2)

Para ter certeza de que o emacs está realmente usando abas em vez de espaços:

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

Como um aparte, o padrão para o emacs ao retroceder em uma guia é convertê-lo em espaços e, em seguida, excluir um espaço. Isso pode ser chato. Se você quiser apenas excluir a guia, você pode fazer isso:

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

Desfrutar!

4
qwerty9967

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

4
dividebyzero

As personalizações podem sombrear (setq tab width 4), então use setq-default ou deixe Personalizar saber o que você está fazendo. Eu também tive problemas semelhantes ao OP e corrigi-lo sozinho, não precisei ajustar tab-stop-list ou qualquer função insert:

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

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

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

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 um desperdício:

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

Note que quote precisa de dois números para funcionar (mas não mais!).

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

M-i

1
ryanpcmcquen

Do meu arquivo init, diferente porque eu queria espaços em vez de abas:

 
 (add-hook 'sql-mode-hook 
 (lambda () 
 (progn. 
 (setq-default tab-width 4) 
 (setq recuo-tabs-mode nil) 
 (setq função-linha de recuo 'tab-to-tab-stop) 
 (modificar-entrada-de-sintaxe? _ "w "); agora '_' não é considerado um delimitador de Word 
 (modificar-entrada de sintaxe? -" w "); agora '-' não é considerado um delimitador de Word 
)) ) 
0
forkandwait

Você tentou

(setq  tab-width  4)
0
GrokCode

By the way, para C-mode , eu adiciono (setq-default c-basic-offset 4) para. emacs. Veja http://www.emacswiki.org/emacs/IndentingC para mais detalhes.

0
flyrain
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
0
waseemq