emacs-devel
[Top][All Lists]
Advanced

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

Re: How to run indent command in arbitrary buffer while respecting user


From: Eli Zaretskii
Subject: Re: How to run indent command in arbitrary buffer while respecting user settings?
Date: Fri, 30 Jun 2023 08:50:12 +0300

> From: Ihor Radchenko <yantar92@posteo.net>
> Date: Thu, 29 Jun 2023 19:44:44 +0000
> 
> In Org mode, we sometimes have a need to use third-party major mode to
> do indentation:
> 
> #+begin_src emacs-lisp
> (when t
> 'indent-me)
> #+end_src
> 
> To do this, we currently create a major mode buffer containing the code
> and run whatever is bound to <TAB> there.
> 
> This, however, is broken when user re-binds <TAB> to something else.
> Or when something like evil-mode re-binds <TAB>
> (https://github.com/emacs-evil/evil/issues/1806)
> 
> I am now considering running
> (funcall-interactively #'indent-for-tab-command)
> 
> However, looking at 25 Indentation section of Elisp manual:
> 
>        The simplest way to perform indentation is the <TAB> key.  In most
>     major modes, this runs the command ‘indent-for-tab-command’.  (In C and
>     related modes, <TAB> runs the command ‘c-indent-line-or-region’, which
>     behaves similarly, *note C Indent::).
> 
> I noticed that C and related modes have some alternative setting for
> indentation. So, using `indent-for-tab-command' appear to be not as
> reliable, after all.
> 
> Is there any reliable way to perform indentation in an arbitrary major
> mode programmatically?
> 
> I notice that cc-mode.el has a comment that the current <TAB> re-binding
> is at least debatable:
> 
>   (substitute-key-definition 'indent-for-tab-command
>                            ;; XXX Is this the right thing to do
>                            ;; here?
>                            'c-indent-line-or-region
>                            c-mode-base-map global-map)
> 
> So, should I simply ignore what cc-mode does and go ahead relying upon
> `indent-for-tab-command' doing the right thing?

There are other, better alternatives: you could either call
indent-according-to-mode or (funcall indent-line-function) instead.
Yet another alternative is to use indent-region-function.



reply via email to

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