emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: tree-sitter: conceptional problem solvable at Emacs' level?


From: Konstantin Kharlamov
Subject: Re: tree-sitter: conceptional problem solvable at Emacs' level?
Date: Sat, 11 Feb 2023 10:53:41 +0300
User-agent: Evolution 3.46.3

On Sat, 2023-02-11 at 10:11 +0300, Konstantin Kharlamov wrote:
> On Sat, 2023-02-11 at 07:51 +0100, Theodor Thornhill wrote:
> > 
> > 
> > On 11 February 2023 07:36:26 CET, Konstantin Kharlamov <hi-angel@yandex.ru>
> > wrote:
> > > On Sat, 2023-02-11 at 09:25 +0300, Konstantin Kharlamov wrote:
> > > > On Sat, 2023-02-11 at 10:17 +0800, Po Lu wrote:
> > > > > Eli Zaretskii <eliz@gnu.org> writes:
> > > > > 
> > > > > > However, I meant the IDEs which are using tree-sitter and support
> > > > > > developing C/C++ programs.  I believe some do.
> > > > > 
> > > > > I think most of those have similar problems supporting macros.
> > > > > Who knows their names? I may be able to ask some of their users.
> > > > 
> > > > From my experience on and off work, there are just two IDEs (as in, not
> > > > editors)
> > > > used most widely for C++ code: QtCreator and Visual Studio. The first
> > > > you
> > > > discussed, the second is proprietary.
> > > > 
> > > > Then again, people most often code in C++ and C with text editors, in
> > > > that
> > > > case
> > > > popular choices from my experience: Sublime Text and VS Code. These two
> > > > have
> > > > don't use tree-sitter either.
> > > 
> > > I installed Sublime Text on my Archlinux and tested with the C++ code OP
> > > posted.
> > > 
> > > What I see is that ST does seem confused about indentation, while trying
> > > to
> > > make
> > > a newline right after `slots:` line.
> > > 
> > > However, if you try to make a newline after the `void someSlot() {};`
> > > line,
> > > it
> > > will use the indentation used on the previous line.
> > > 
> > > The default cc-mode in Emacs works similarly. The cc-ts-mode on the other
> > > hand
> > > doesn't make use of the previous indentation, and I think it should. It
> > > would
> > > resolve that problem and others, because in my experience it happens very
> > > often
> > > in C and C++ code that you want some custom indentation level, so you just
> > > make
> > > one and you expect the editor to keep it while creating more new lines.
> > > 
> > 
> > That last statement sounds easily solvable. Can you send me a short example
> > describing exactly what you want in a code snippet and I'll add it.
> > 
> > Thanks,
> > Theo
> 
> Thank you! The example is below, but please wait a bit just to make sure
> there's no opposition from other people, because I don't know if it works like
> this on purpose, or not.
> 
> Given this C++ code with weird class members indentation:
> 
>     class Foo {
>            int a;
>            bool b;
>     };
> 
> Now, suppose you put a caret after `bool b;` text and press Enter to make a
> new
> line (all tests are done with `emacs -Q`). The behaviour:
> 
> * cc-mode and Sublime Text: creates a newline with the indentation exactly as
> on
> the previous one.
> * cc-ts-mode: re-indents the `bool b;` line, then creates a new one with a
> custom indentation that is different from one on the `int a;` line.
> 
> The cc-mode and Sublime Text behaviour seems like less annoying to me, because
> if I wanted to reindent the prev. line, most likely I'd did it by pressing an
> indentation hotkey (e.g. `=` in Evil mode I use).

FTR, re-using indentation from prev. line seems to has been the default in all
Emacs modes, and one that proved to be useful. To support that here are more
examples. 

While writing C, depending on a circumstances the pre-existing code might have
indentation of function args like this:

foo(arg1,
    arg2);

Or like this:

foo(
 foo1,
 foo2);

You might want to add another argument to the call, but you don't want to re-
indent everything. So when you press Enter, you expect the new line to have
prev. indentation.

Another example from elisp-mode: I have this snippet in my Evil config:

(use-package evil
  ;; […]
  :bind (:map evil-insert-state-map
         ;; after having insert-state keymap wiped out make [escape] switch back
         ;; to normal state
         ([escape] . 'evil-normal-state)

         :map evil-normal-state-map
         ("C-u"    . 'evil-scroll-up)
         ("k"      . 'evil-previous-visual-line)
         ("j"      . 'evil-next-visual-line)
         ;; […]

         :map evil-visual-state-map
         ("k"      . 'evil-previous-visual-line)
         ("j"      . 'evil-next-visual-line)

         :map isearch-mode-map
         ;; allow for "up/down" history scrolling in / search
         ("<down>" . 'isearch-ring-advance)
         ("<up>"   . 'isearch-ring-retreat)
         )
  )

If I were to re-indent everything, the indentation in `:bind` body would be
different. But I want to keep it the way it is now, and due to elisp-mode re-
using prev. line indentation, whenever I create a new line, it will always have
the indentation I wanted.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]