emacs: como recuar / desanuviar a região do código python por 4 espaços?

60

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

Idealmente, eu gostaria de algo que não seja sensível ao contexto (por exemplo, me permitirá recuar passagens dentro de documentos em que a indentação não esteja relacionada à sintaxe do python).

Minha linha de modo é exibida (Python). Pesquisando na web eu encontrei um monte de discussão sobre usando python-modeem vez de python, mas eu só comecei a usar emacs há alguns dias por isso estou cauteloso em mudar os padrões antes de eu ter tido a chance de entender e eles. Se mudar para python-modeé a melhor opção, fico feliz em aceitar isso como resposta.

O que eu tentei (no manual):

  • <TAB> sem efeito
  • C-M-\ sem efeito
  • C-x <TAB> (recuar rigidamente) recuar todas as linhas por uma coluna (e desmarcar a região)
  • M-i recua uma primeira linha por uma tabulação (comprimento de 8 espaços)
  • C-M-q - "CMq está indefinido"

A única maneira que encontrei é usar regex-replace, mas é um número terrível de pressionamentos de tecla para uma tarefa tão simples.

Ian Mackinnon
fonte

Respostas:

69

Supondo que a variável python-indentseja 4:

M-x python-shift-right (C-c >)
M-x python-shift-left  (C-c <)
Chen Levy
fonte
5
Eu tive que fazer python-indent-shift-left.
usar o seguinte comando
17

indent-rigidlyusa um argumento de prefixo indicando quanto recuar, C-u 42 C-x TABrecua por 42 colunas e, como o argumento de prefixo padrão é 4, C-u C-x TABrecua por 4 colunas.

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

Gilles 'SO- parar de ser mau'
fonte
8

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

C-u 4 M-x indent-rigidlyrecuar a região em quatro espaços, C-u -4 M-x indent-rigidlypara remover quatro espaços.

KeithB
fonte
4

Cx Cx marca o código e, em seguida, Mx recuo para o modo de tabulação

Essa é a salvaguarda se você pressionou a guia para cada linha.

Nestor A. Diaz
fonte
3

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

Selecione as linhas no modo de coluna e adicione quatro espaços a todos eles ao mesmo tempo:

  1. Vá para a coluna 1 da primeira linha que você deseja recuar.
  2. C-<space> definir marca
  3. mova o ponto para as últimas linhas (permaneça na coluna um)
  4. C-x r tpara 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 2-3) e pressionar <DEL>

Steve Lianoglou
fonte
3

Atualizando a solução de Chen acima, atualmente (testado no Emacs 24.4.1), os comandos foram renomeados. Portanto, 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. emiti-los digitando M-x python-indent-shift-rightouM-x python-indent-shift-left

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

  3. religá-los. Por exemplo, em um teclado com um botão do Windows eu uso:

    (global-set-key (kbd "s-s") 'python-indent-shift-left) 
    (global-set-key (kbd "s-d") 'python-indent-shift-right)
    
Amnon Harel
fonte
0

Ambos S-<LEFT>eS-<RIGHT> funcionam bem no Pythonmodo principal. É especialmente conveniente no Modo Cua onde C-ce C-xcomportamento mudanças de copiar / corte quando uma região está seleccionado.

Vincent
fonte