Eu quero navegar entre as linhas de um arquivo com base no recuo. O arquivo é estruturado por recuo: uma linha mais recuada que a linha anterior é filha da linha anterior, uma linha que tem o mesmo recuo que a linha anterior é seu irmão. Estou procurando principalmente três comandos:
- Vá para o próximo irmão, ou seja, a próxima linha com o mesmo recuo, pulando as linhas mais recuadas, mas não pulando além de uma linha menos recuada.
- Vá para o irmão anterior, ou seja, a mesma coisa na outra direção.
- Mover para o pai, ou seja, para a linha anterior com menos recuo.
A posição da coluna do ponto não deve mudar.
Estes são análogos para dados estruturados-recuo para forward-sexp
, backward-sexp
e backward-up-list
para dados estruturados-sexp. O recuo corresponde à estrutura do programa em linguagens como Haskell e Python; essas funções podem ser especialmente úteis nesse contexto, mas não estou procurando nada específico do modo (meu caso de uso principal são dados estruturados por intenção dentro de outro formato de arquivo).
Os níveis de recuo para colorir podem ajudar a navegar manualmente com Up/ Downmas eu quero algo automático.
Essa pergunta do superusuário é semelhante, mas com requisitos mais fracos e, atualmente, não possui respostas que atendam aos meus requisitos.
fonte
set-selective-display
fica perto do que precisa?indent-tools
em melpa ( indent-tools ), que provavelmente funciona para esse fim. O primeiro commit foi em 16 de maio de 2016, cerca de 3 meses após a pergunta.Respostas:
Examinando as quatro respostas disponíveis atualmente ( duas no Superusuário e duas nesta questão), vejo os seguintes problemas:
outline.el
, ele também está basicamente indo de linha em linha de qualquer maneira (usandooutline-next-visible-heading
) em nosso caso, pois (quase) todas as linhas corresponderiam ao regexp de contorno e contariam como um "cabeçalho".Então, reunindo algumas idéias de cada uma, tenho o seguinte: avançar linha por linha, passando por linhas vazias e mais recuadas. Se você estiver em igual recuo, então é o próximo irmão. A ideia básica é assim:
Generalizado adequadamente (para frente / para trás / para cima / para baixo), o que estou usando se parece com o seguinte atualmente:
Ainda há algumas funcionalidades desejáveis, e observar
outline.el
e reimplementar algumas delas pode ajudar, mas estou feliz com isso por enquanto, para meus propósitos.fonte
(current-line)
foi algomisc-fns.el
que de alguma forma eu tenho na minha instalação do Aquamacs como parte de algumaoneonone.el
biblioteca.Esse recurso existe no Emacs. O modo de estrutura de tópicos descreve um documento como contendo linhas de cabeçalho com um nível e possui facilidades para se mover entre os níveis. Podemos definir cada linha como uma linha de cabeçalho com um nível que reflete seu recuo: definido
outline-regexp
como recuo. Mais precisamente, o recuo mais o primeiro caractere não-espaço em branco (e o início do arquivo é o nível mais alto):\`\|\s-+\S-
.No Emacs 22.1 a 24.3, você pode simplificar isso para:
Então você pode usar comandos de movimento de estrutura de tópicos :
C-C @ C-f
(outline-forward-same-level
) para passar para o próximo irmão;C-C @ C-b
(outline-backward-same-level
) para passar para o irmão anterior;C-C @ C-u
(outline-up-heading
) para ir para o pai.Uma guia e um espaço contam para a mesma quantidade de recuo. Se você tiver uma mistura de guias e espaços, defina
tab-width
adequadamente e ligueuntabify
.Se o modo principal atual tiver configurações de estrutura de tópicos, elas poderão entrar em conflito. Nesse caso, você pode usar uma das muitas soluções de vários modos principais , sendo a mais simples criar um buffer indireto e configurá-lo para o modo principal de estrutura de tópicos. No modo principal de estrutura de tópicos, os atalhos de teclado padrão são mais simples de digitar
C-c C-f
:, etc.fonte
M-x make-local-variable RET outline-regexp RET
não aceita essa variável e diz apenas `[No match]`. Ainda estou para analisá-lo com mais cuidado.outline-regexp
não é mais um defcustom e não pode ser definido de forma interativa tão facilmente.Os três comandos a seguir, minimamente testados, devem permitir a navegação básica por linhas recuadas. Desculpas pela repetição de código.
fonte
(current-column)
mas faz com que o cursor não se mova), mas não atende exatamente às minhas especificações: mover em um nível de indentação passa menos- linhas recuadas.ind-forward-sibling
basta procurar a próxima linha com o mesmo recuo, para que ela pule as linhas com menos recuo (ela avança mesmo quando não há irmãos à frente).