I am a C++ dev. I am now able to follow up symbols or files using LSP,/projectile/ivy/transient aso… but inside one file, I have difficulties going quickly up function by function, or by if/for statement. Do you know a convenient way to do this ? I am interested in any navigation tips as well ! Thanks for your help !

  • @00-11B
    link
    fedilink
    English
    17 months ago

    Here are some ways to move around. The first two are in vanilla Emacs. (There are previous functions corresponding to the next functions mentioned.)

    • C-M-e and C-M-a: Move to next “defun” (function definition).

    • Imenu, if you know the name of the thing (e.g. a definition) you`re looking for. (Various libraries let you complete/filter and cycle among candidates.)

    • next-visible-thing. Moves to end of next THING. First nonconsecutive use prompts for THING type. Or use next-visible-thing to define such a command for a specific kind of THING (so no prompt needed for the kind).

      Requires library thing-cmds.el, which requires hide-comnt.el.

      Predefined THINGS (library thingatpt+.el needed for some):

      sexp, button, char, char-same-line, color, comment, decimal-number, defun, email, filename, hex-number, line, list, list-contents, non-nil-symbol-name, number, overlay, page, paragraph, region-or-word, sentence, string, string-contents, symbol, symbol-name, unquoted-list, url, whitespace, whitespace-&-newlines, word

      “Visible” means invisible text is skipped. Option ignore-comments-flag controls whether to also ignore text in comments.

    • Command fw-to-next-thing. Moves to the start of the next THING (unlike next-visible-thing, which moves to its end).

      Requires libraries find-where.el and thingatpt+.el needed for some).

      Library find-where.el lets you get something at a position where an arbitrary predicate is true (not just a position at the start of a text THING), or move to such a position.

      E.g., function fw-next-thing returns the next THING and its position, and command fw-to-next-thing goes there.

      E.g., this defines a command to move to the beginning of the next sexp:

        (defun to-next-sexp (n)
          "Go to next start of a sexp."
          (interactive "p")
          (fw-to-next-thing 'sexp nil n))
      

      Likewise, for fw-next-where and fw-to-next-where, which look for the next place and some data where some predicate is satisfied.

      See the Commentary in find-where.el.

    • Commands in library isearch-prop.el to search within the text of certain things.

      E.g., isearchp-imenu-non-interactive-function searches only within (or only outside of) definitions of functions that are not commands. isearch-property-forward searches only within text that has (or doesn’t have) a given text or overlay property. isearchp-zones-forward searches only within (or only outside) the text of a given set of zones (i.e., within a noncontiguous region).

    • The old library hideif.el lets you hide text that’s within ifdefs.

    https://www.emacswiki.org/emacs/download/thing-cmds.el

    https://www.emacswiki.org/emacs/download/hide-comnt.el

    https://www.emacswiki.org/emacs/download/find-where.el

    https://www.emacswiki.org/emacs/download/thingatpt%2B.el

    https://www.emacswiki.org/emacs/download/isearch-prop.el

    • @_Gink0_OPB
      link
      fedilink
      English
      17 months ago

      Awesome compilation!! I already start using C-M e/a already mentioned in this post. It’s simple and effective. I need to finish reading everything to get a way to move inside one function.