[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.