emacs: como indentar / unindent região do código python por 4 espaços?

54

Eu tenho uma região de código Python selecionada no emacs. Quais são as maneiras mais eficientes de recuar e desvincular cada linha por 4 espaços?

Idealmente, eu gostaria de algo que não seja sensível ao contexto (por exemplo, ele me permitirá recuar passagens dentro de docstrings onde o recuo não está relacionado à sintaxe do python).

Minha linha de modo mostra (Python) . Pesquisando na web eu encontrei muita discussão sobre o uso de python-mode em vez de python , mas eu só comecei a usar emacs alguns dias atrás, então estou cauteloso em mudar os padrões antes de ter uma chance de entendê-los. Se mudar para python-mode é a melhor opção, estou feliz em aceitar isso como resposta.

O que eu tentei (no manual):

  • <TAB> sem efeito
  • C-M-\ sem efeito
  • C-x <TAB> (indent-rigidly) recua cada linha por uma coluna (e desmarca a região)
  • M-i indenta uma primeira linha por uma tabulação (comprimento de 8 espaços)
  • C-M-q - "C-M-q é indefinido"

A única maneira que encontrei é usar o regex-replace, mas esse é um número considerável de pressionamentos de teclas para uma tarefa tão simples.

    
por Ian Mackinnon 09.08.2010 / 14:51

8 respostas

66

Supondo que a variável python-indent seja 4:

M-x python-shift-right (C-c >)
M-x python-shift-left  (C-c <)
    
por 09.08.2010 / 15:06
15

indent-rigidly usa um argumento de prefixo que indica quanto recuar, portanto, C-u 42 C-x TAB indents por 42 colunas e, como o argumento de prefixo padrão é 4, C-u C-x TAB indents por 4 colunas.

Se você quiser selecionar a região novamente, faça C-x C-x depois.

    
por 09.08.2010 / 15:07
7

Use o comando indent-rigidly com um prefixo numérico.

C-u 4 M-x indent-rigidly para recuar a região por quatro espaços, C-u -4 M-x indent-rigidly para remover quatro espaços.

    
por 09.08.2010 / 15:07
4

C-x C-x marque o código e depois M-x recuo para modo de tabulação

Esse é o salvamento se você tiver pressionado a guia para cada linha.

    
por 07.11.2012 / 00:47
3

Você também pode usar o modo de coluna.

Selecione as linhas no modo de coluna e adicione quatro espaços a todas de uma vez:

  1. Ir para a coluna 1 da primeira linha que você deseja recuar.
  2. C-<space> para definir a marca
  3. move o ponto para as últimas linhas (fique na coluna um)
  4. C-x r t para entrar no modo de coluna (ou C-<RET> se você tiver o modo CUA)
  5. <space><space><space><space><RET>

Você pode fazer uma manobra semelhante para excluir quatro espaços - basta incluir 4 colunas na região marcada (etapas de 2 a 3) e clicar em <DEL>

    
por 09.08.2010 / 17:26
3

Atualizando a solução de Chen acima, atualmente (testado no Emacs 24.4.1) os comandos foram renomeados. Então, supondo que você queira recuar de acordo com a variável python-indent, os comandos são python-indent-shift-left e python-indent-shift-right. Você pode:

  1. digite-os digitando M-x python-indent-shift-right ou M-x python-indent-shift-left

  2. use os atalhos padrão do modo em python C-c > e C-c <

  3. religue-os. Por exemplo, em um teclado com um botão do Windows, uso:

    (global-set-key (kbd "s-s") 'python-indent-shift-left) 
    (global-set-key (kbd "s-d") 'python-indent-shift-right)
    
por 25.02.2015 / 13:37
0

Composability é o rei do Emacs, apenas combine M-i com link e você tem o comando indent block . Isso é você:

  1. M-> N vezes (em que N é o número de linhas no bloco)
  2. M-i
por 04.08.2015 / 15:37
0

Os dois S-<LEFT> e S-<RIGHT> funcionam bem em Python modo principal. É especialmente conveniente no Modo Cua , onde o comportamento C-c e C-x muda para copiar / recortar quando uma região é selecionada .

    
por 26.09.2017 / 11:52