Qual é a melhor maneira de conseguir algo como dobramento de código ou o tipo de ciclo que o modo org usa. Qual seria a melhor solução no elisp para criar este tipo de comportamento?
EDIT: Desculpe, não fui claro. Eu quero programar algo em elisp que faz coisas muito semelhantes à dobra de código ou, na verdade, mais como o modo org com a hierarquia que pode ser expandida. Estou me perguntando a melhor maneira de conseguir esse efeito. Acho que ouvi que as sobreposições do emacs são uma boa solução, mas não sei.
No que diz respeito a dobrar, eu apenas uso o display integrado de seleção
EDITAR NÚMERO 2:
Obrigado pelas respostas, mas acho que estou fazendo a pergunta errada, então deixe-me tentar ser mais claro sobre o que estou tentando fazer. Eu gostaria de criar o seguinte
Quando você coloca seu ponto em uma função e chama esta função elisp, ela colocará a definição da função de onde quer que esteja (estou pensando em usar apenas find-tag para isso) e a desdobrará no buffer atual. A ideia é que se você tiver que pular para um buffer diferente para ler a definição da função, eu sinto que é uma mudança de contexto para outro arquivo. Então, eu gostaria que ele se comportasse como dobramento de código, apenas puxando código externo do buffer. Isso apresenta alguns problemas, pois não é possível colar o código de forma aguda no buffer ou, se alguém salvá-lo, salvará o código puxado. Portanto, gostaria de saber se existe uma maneira de criar uma área dentro de um buffer que também não faz parte do buffer. Eu acho que faz sentido.
fonte
EDIT NB 2
e faça uma nova pergunta para ele.Respostas:
Geralmente, dobrar é desnecessário com o emacs, pois ele tem ferramentas que implementam explicitamente as ações que as pessoas fazem manualmente ao dobrar o código.
A maioria das pessoas tem bom sucesso com pesquisas incrementais simples. Vê "foo" mencionado em algum lugar? Digite C-s
foo
, encontre a definição, pressione Enter, leia-a e pressione C-x C-xpara voltar para onde estava. Simples e muito útil.A maioria dos modos suporta imenu . M-x
imenu
permitirá que você pule para uma definição de função (etc.) por nome. Você também pode vinculá-lo a um clique do mouse para obter um menu de funções (ou adicioná-lo à barra de menus; consulte a página Informações para obter mais detalhes). Ele fornece dados para o modo de função qual, o que permitirá que você veja em qual função você está atualmente na linha de modelo. (Por que suas funções são tão longas, então?)Também existe a barra de velocidade , que exibe as informações do imenu (e outras coisas) graficamente.
Se você deseja obter uma visão geral do seu arquivo, tente M-x
occur
". Dado um regex, ele criará um novo buffer com cada correspondência no buffer atual. Você pode pesquisar por" (defun "para obter uma visão geral das funções do arquivo atual Ao clicar no resultado, você será movido para essa posição no arquivo.De qualquer forma, pense sobre o que você realmente deseja alcançar, e o Emacs provavelmente implementa isso. Não lute com ferramentas imperfeitas que o fazem dobrar e desdobrar coisas constantemente.
fonte
modo ocultar-mostrar (
hs-minor-mode
) com atalhoC-c @ C-M-h
de teclado padrão para acionar o dobramento (hs-hide-all
)fonte
zR
,zM
,zo
,zc
.Outra maneira de tirar a pele do gato:
M-1 Cx $ e mágica acontece!
Como de costume, é magia branca: Cx $ trará seu código de volta.
do blog de magia do emacs menor
Apenas para completar: M-3 Cx $ mostraria código aninhado mais profundo e assim por diante.
FWIW Eu fiz um pequeno ajudante hoje baseado em smth. encontrado aqui para que F5 alterne a dobradura de código com base na posição atual do cursor:
fonte
Eu uso o modo de contorno menor para dobrar meu código Python. Em vez de precisar colocar {{{e}}} como no modo dobrável, ele usa onde o bloco está definido.
http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode
Tenho certeza de que vem com o emacs. Em seguida, adiciono isso ao meu .emacs
fonte
outline-mode
suporta python fora da caixa no emacs 24 - sem necessidade deoutline-level
funções personalizadas . Isso é tudo que eu precisava adicionar ao meuuser.el
:(add-hook 'python-mode-hook 'outline-minor-mode)
outline-minor-mode-prefix
- os atalhos de teclado padrão são horríveis - eu uso(setq outline-minor-mode-prefix (kbd "C-;"))
Você também pode obter o dobramento de código usando CEDET com o seguinte código no arquivo init:
Após a avaliação deste código, o pequeno triângulo aparecerá na área fringle, então você poderá dobrar e desdobrar o código usando-o. Este método é mais preciso, pois utiliza informações sintáticas, extraídas do código-fonte
fonte
o modo hs-minor funciona perfeitamente.
Funciona ainda mais bem quando combinado com fold-dwim (faça o que quero dizer). Depois, há o fold-dwim-org, que fornece atalhos de teclado como o modo org para dobrar código! Ambos podem ser instalados via marmelada (e eu acho que elpa).
fonte
Aparentemente não existe uma solução perfeita, mas acho que a melhor é esta:
http://www.emacswiki.org/emacs/FoldingMode
fonte
vimish-fold
também é uma solução fácil e agradável.https://github.com/mrkkrp/vimish-fold .
Na página inicial:
Usando o excelente
use-package
eu instalo e ativo usando este trecho na minha configuração:fonte
Estou surpreso que ninguém tenha mencionado o estreitamento-alargamento. É super incrível, ele vem com o emacs também. Basta selecionar o código que você deseja focar e pressionar
C-x n n
, para voltar ao modo de visualização completa, basta fazerC-x n w
. Eu sempre prefiro usar a funcionalidade embutida do emacs do que entulhar meu espaço do usuário com outro pacote. Se o emacs pode fazer isso com funcionalidade embutida, então eu prefiro isso a algum pacote de terceiros, mas isso é só comigo, não significa ou implica em nada além de que eu gosto de coisas simples em vez de configurações longas complexas.fonte
emacs vem com hs-minor-mode que facilita o dobramento de código entre expressões balanceadas http://www.emacswiki.org/emacs/HideShow
fonte
Eu acredito que a sua comparação do seu "projeto" com a dobra não é muito boa, porque a dobra é sobre mudar a aparência enquanto mantém o conteúdo do buffer intacto (o texto). Seu projeto envolveria a exibição de texto extra, mantendo o conteúdo do buffer intacto, AFAIU. Assim. não é implementável como uma composição de inserção de texto e dobramento (então, o conteúdo do buffer seria alterado).
Mas talvez seja realmente possível com o mesmo mecanismo que a dobragem é feita com - "sobreposições" ... Considere as propriedades de sobreposição "antes da string" e "depois da string" ; talvez você pudesse colocar suas definições de função nessas strings pertencentes a uma sobreposição de comprimento zero no ponto. Observe a função de contorno-bandeira-região para ver como as sobreposições são usadas no modo contorno.
fonte
Se você usar
hs-minor-mode
, pode ser uma boa ideia definir também um atalho mais conveniente, por exemplo:fonte
Com inspiração na resposta de einSelbst :
Voila,
C-x $
de repente tornou-se útil, mesmo semC-u
nemM-4
negócio.fonte
Se estiver fazendo JavaScript e usando
js2-mode.el
, você pode:C-c C-f
: alternar ocultar / mostrar tudoC-c C-e
: ocultar elementoC-c C-s
: mostrar elementofonte