I’m finding that defining outline-regexp does not do for me in python-mode what it does for me in other language modes. Someone else on Stack Exchange ran into the same problem, and a suggested answer to their question makes it clear that python-mode preconfigures some definitions for outline-minor-mode. But what those preconfigurations are, and more importantly how to use them, is not documented anywhere I can find.

  • _davidsmith@alien.topB
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 year ago

    Beyond an overview in the manual. I’m not aware of any documentation outside of the source in outline.el which defines outline-regexp to match the beginning of a heading, outline-heading-end-regexp to match the end of a heading, outline-search-function to advance to the next heading, and outline-level to figure out the level of the heading which can be used with outline-heading-alist.

    python.el provides values for outline-regexp, outline-heading-end-regexp, and outline-level which mostly work for me except for decorators and parametrized test cases.

    The Stack Exchange discussion gives an example of customizing the values using a hook into python-mode.

  • JDRiverRun@alien.topB
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 year ago

    M-x find-library python, followed by C-s outline- shows what’s happening: python-base-mode sets the local outline variables locally, in its mode body. Since mode hooks always run after the body of their mode definitions, you could add a bit of code to the python-base-mode-hook (or a parent of it, like prog-mode-hook) setting your desired outline config there (i.e. overwriting what python mode did).

    I do that using outli simply (in a use-package stanza):

     :hook ((prog-mode text-mode) . outli-mode))
    

    BTW, here’s a handy guide (from this epic answer) to what runs in which order upon invoking a derived major mode like python-ts-mode:

    So when we call (child-mode), the full sequence is:
    
    (run-hooks 'change-major-mode-hook) ;; actually the first thing done by
    (kill-all-local-variables)          ;; <-- this function
    ,@grandparent-body
    ,@parent-body
    ,@child-body
    (run-hooks 'change-major-mode-after-body-hook)
    (run-hooks 'grandparent-mode-hook)
    (run-hooks 'parent-mode-hook)
    (run-hooks 'child-mode-hook)
    (run-hooks 'after-change-major-mode-hook)