Defina 4 recuo de espaço no Emacs no modo de texto
-
09-06-2019 - |
Pergunta
Não tive sucesso em fazer com que o Emacs mudasse de 8 guias de espaço para 4 guias de espaço ao pressionar o botão ABA 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 mude meu .emacs
arquivo (ou variáveis locais do meu buffer) o ABA botão sempre faz a mesma coisa.
- Se não houver texto acima, recuar 8 espaços
- Se houver texto na linha anterior, recue até o 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 há texto na linha anterior?
Solução
(customize-variable (quote tab-stop-list))
ou adicione lista de tabulação entrada para variáveis de conjunto personalizado em .emacs arquivo:
(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))))
Outras dicas
Resposta curta:
O ponto principal é dizer ao emacs para inserir o que quiser ao recuar, isso é feito alterando a função de linha de indentação.É mais fácil alterá-lo para inserir uma tabulação e depois alterar as tabulações para 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:
De Recuo controlado pelo modo principal no manual do emacs:
Uma função importante de cada modo principal é personalizar a chave para recuar adequadamente para o idioma que está sendo editado.
[...]
A variável de função de linha de indents é a função a ser usada por (e vários comandos, como ao chamar a região de indent) para recuar a linha atual.O comando de acordo com o modo de acordo com o modo não chama essa função.
[...]
O valor padrão é relativo para muitos modos.
Do manual indent-relative @ emacs:
Espaço-relativa-relativa para o próximo ponto de recuo na linha não branqueada anterior.
[...]
Se a linha não branqueada anterior não tiver pontos de recuo além do ponto da coluna começar, o `TAB-TAB-STOP 'será feito.
Basta alterar o valor da função indent-line-function para a função insert-tab e configurar a inserção da tabulação como 4 espaços.
Atualizar: Desde o Emacs 24.4:
tab-stop-list
agora é implicitamente estendido ao infinito.Seu valor padrão é alterado paranil
o que significa uma parada de tabulação a cadatab-width
colunas.
o que significa que não há mais necessidade de definir tab-stop-list
da maneira mostrada abaixo, pois você pode mantê-lo definido para nil
.
A resposta original segue ...
Sempre me dói um pouco ver coisas como (setq tab-stop-list 4 8 12 ................)
quando o number-sequence
A funçã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))
Você pode achar mais fácil configurar suas guias da seguinte maneira:
M-x customize-group
No Customize group:
solicitar entrar indent
.
Você verá uma tela onde poderá definir todas as opções de recuo e configurá-las para a sessão atual ou salvá-las para todas as sessões futuras.
Se você fizer assim, você vai querer configurar um arquivo de personalizações.
(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)
(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 para o comentário interno também
(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)
Esse problema não é causado pela falta de paradas de tabulação;é que o emacs tem um (novo?) método de aba 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 está definida, que é um método relativo ao recuo para o modo de texto.Eu não descobri uma boa maneira de substituir a variável de função de linha de indentação (o gancho do modo de texto não está funcionando, então talvez ele esteja sendo redefinido após a execução dos ganchos de modo?), mas uma maneira simples de se livrar disso O comportamento é simplesmente descartar o método intent-for-tab-command definindo TAB para o método mais simples de tab-to-tab-stop:
(define-key text-mode-map (kbd "TAB") 'tab-to-tab-stop)
Experimente 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 tabulações 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.
Você pode adicionar essas linhas de código ao seu arquivo .emacs.Ele adiciona um gancho para o modo de texto usar insert-tab em vez de indent-relative.
(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.
Apenas mudar o estilo com o estilo c-set foi o suficiente para mim.
Adicione isto ao seu arquivo .emacs:
Isso definirá a largura de exibição de uma guia para 2 caracteres (altere o número 2 para o que desejar)
(setq default-tab-width 2)
Para ter certeza de que o emacs está realmente usando tabulações em vez de espaços:
(global-set-key (kbd "TAB") 'self-insert-command)
Além disso, o padrão do emacs ao retroceder em uma guia é convertê-lo em espaços e, em seguida, excluir um espaço.Isso pode ser irritante.Se quiser apenas excluir a guia, você pode fazer o seguinte:
(setq c-backspace-function 'backward-delete-char)
Aproveitar!
As personalizações podem sombrear (setq tab width 4)
então use setq-default
ou deixe o Customize saber o que você está fazendo.Também tive problemas parecidos com o OP e resolvi só com isso, não precisei ajustar tab-stop-list
ou qualquer insert
funções:
(custom-set-variables
'(tab-width 4 't)
)
Achei útil adicionar isto imediatamente depois (uma dica do emacsWiki):
(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)
As melhores respostas não funcionaram até que escrevi isto no arquivo .emacs:
(global-set-key (kbd "TAB") 'self-insert-command)
Esta é a única solução que evita que uma tabulação seja inserida para mim, sem uma sequência ou conversão de tabulações 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))
)
Observe 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-eu
Você tentou
(setq tab-width 4)
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
Aliás, para Modo C, Eu adiciono (setq-default c-basic-offset 4)
para .emacs.Ver http://www.emacswiki.org/emacs/IndentingC para detalhes.
Do meu arquivo init, diferente porque eu queria espaços em vez de tabulações:
(add-hook 'sql-mode-hook (lambda () (progn (setq-default tab-width 4) (setq indent-tabs-mode nil) (setq indent-line-function 'tab-to-tab-stop) (modify-syntax-entry ?_ "w") ; now '_' is not considered a word-delimiter (modify-syntax-entry ?- "w") ; now '-' is not considered a word-delimiter )))