From: "Kévin Le Gouguec" <email@example.com> To: Juri Linkov <firstname.lastname@example.org> Cc: Org Mode list <email@example.com>, Emacs developers <firstname.lastname@example.org> Subject: Re: Reconciling org-mode idiosyncrasies with Emacs core Date: Mon, 04 May 2020 12:45:24 +0200 Message-ID: <email@example.com> (raw) In-Reply-To: <firstname.lastname@example.org> (Nicolas Goaziou's message of "Wed, 29 Apr 2020 14:30:44 +0200") [-- Attachment #1: Type: text/plain, Size: 314 bytes --] Hi Nicolas, I took a stab at making RET obey electric-indent-mode in org-mode. I've got something working; I'd like to ask for a review before moving on to Changelog and ORG-NEWS entries (and tackling C-j… and maybe writing a few unit tests?). Here's the patch, with some additional comments below: [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: org-return.patch --] [-- Type: text/x-patch, Size: 2515 bytes --] diff --git a/lisp/org.el b/lisp/org.el index e82463046..681328d96 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -17644,20 +17644,32 @@ call `open-line' on the very first character." (org-table-insert-row) (open-line n))) -(defun org-return (&optional indent) +(defun org--newline (indent arg interactive) + "Call `newline-and-indent' or just `newline'. + +If INDENT is non-nil, call `newline-and-indent' with ARG to +indent unconditionally; otherwise, call `newline' with ARG and +INTERACTIVE, which can trigger indentation if +`electric-indent-mode' is enabled." + (if indent + (newline-and-indent arg) + (newline arg interactive))) + +(defun org-return (&optional indent arg interactive) "Goto next table row or insert a newline. Calls `org-table-next-row' or `newline', depending on context. When optional INDENT argument is non-nil, call -`newline-and-indent' instead of `newline'. +`newline-and-indent' with ARG, otherwise call `newline' with ARG +and INTERACTIVE. When `org-return-follows-link' is non-nil and point is on a timestamp or a link, call `org-open-at-point'. However, it will not happen if point is in a table or on a \"dead\" object (e.g., within a comment). In these case, you need to use `org-open-at-point' directly." - (interactive) + (interactive "*i\nP\np") (let ((context (if org-return-follows-link (org-element-context) (org-element-at-point)))) (cond @@ -17708,23 +17720,20 @@ object (e.g., within a comment). In these case, you need to use (t (org--align-tags-here tags-column))) ;preserve tags column (end-of-line) (org-show-entry) - (if indent (newline-and-indent) (newline)) + (org--newline indent arg interactive) (when string (save-excursion (insert (org-trim string)))))) ;; In a list, make sure indenting keeps trailing text within. - ((and indent - (not (eolp)) + ((and (not (eolp)) (org-element-lineage context '(item))) (let ((trailing-data (delete-and-extract-region (point) (line-end-position)))) - (newline-and-indent) + (org--newline indent arg interactive) (save-excursion (insert trailing-data)))) (t ;; Do not auto-fill when point is in an Org property drawer. (let ((auto-fill-function (and (not (org-at-property-p)) auto-fill-function))) - (if indent - (newline-and-indent) - (newline))))))) + (org--newline indent arg interactive)))))) (defun org-return-indent () "Goto next table row or insert a newline and indent. [-- Attachment #3: Type: text/plain, Size: 1918 bytes --] Nicolas Goaziou <email@example.com> writes: > Kévin Le Gouguec <firstname.lastname@example.org> writes: > >> Do you think a patch that >> >> - tweaked org-return (bound to RET) to default its INDENT argument to >> the current value of electric-indent-mode, After taking an in-depth look at 'org-return' and 'newline', I decided to "let the knife do the work" and simply keep calling 'newline', though with additional arguments: - INTERACTIVE is what makes 'newline' run 'post-self-insert-hook' (thus triggering indentation through electric-indent-mode), - ARG wasn't strictly necessary, but it seemed harmless to add it, and it allows inserting multiple newlines, thus removing one more "Org idiosyncrasy". I felt that introducing org--newline made the code clearer, but I can understand if it seems too trivial to keep. I took the liberty of using this function in the "list item" case too, otherwise there's no way to indent the trailing text. > The change will not appear overnight in Org, i.e., not in Org stable's > branch (Org 9.3.X), and it will be announced in ORG-NEWS. I'll work on ORG-NEWS (plus Changelog entries, plus unit tests) as soon as I'm confident that my approach is satisfactory. (Out of curiosity, could it be argued that this is solving a "bug" in org-mode and, as such, could be committed to Emacs core first, then backported to the org-mode repository? I don't feel strongly either way, I wouldn't want to make things more complicated for Org maintainers.) Now for C-j, in order to minimize breakage (for anyone calling org-return-indent from Lisp code) and simplify disabling the new behaviour (by simply turning off electric-indent-mode in Org), should we bind C-j to a new function? E.g.: (defun org-return-and-maybe-indent () (interactive) (org-return (not electric-indent-mode))) Thank you for your time.
next prev parent reply other threads:[~2020-05-04 10:47 UTC|newest] Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top [not found] <CADwFkm=qkNCWA40ieZ9Dv-gbk6xAzjG16sOa64GT+Zbv9pCC_A@mail.gmail.com> [not found] ` <20200426172206.GC18629@ACM> [not found] ` <email@example.com> [not found] ` <20200427102311.GA4976@ACM> [not found] ` <firstname.lastname@example.org> [not found] ` <email@example.com> [not found] ` <firstname.lastname@example.org> [not found] ` <email@example.com> [not found] ` <firstname.lastname@example.org> [not found] ` <email@example.com> 2020-04-29 12:30 ` Nicolas Goaziou 2020-05-04 10:45 ` Kévin Le Gouguec [this message] 2020-05-04 14:50 ` Nicolas Goaziou 2020-05-04 16:14 ` Kévin Le Gouguec 2020-05-06 14:54 ` [PATCH] Make RET and C-j obey `electric-indent-mode' in org-mode (was: Reconciling org-mode idiosyncrasies with Emacs core) Kévin Le Gouguec 2020-05-07 10:48 ` [PATCH] Make RET and C-j obey `electric-indent-mode' in org-mode Nicolas Goaziou 2020-05-07 12:03 ` Kévin Le Gouguec 2020-05-07 12:21 ` Nicolas Goaziou 2020-05-07 16:45 ` Kévin Le Gouguec 2020-05-07 16:50 ` Kévin Le Gouguec 2020-05-07 19:38 ` Nicolas Goaziou 2020-05-24 6:25 ` Bastien 2020-05-07 13:53 ` Stefan Monnier 2020-05-07 15:33 ` Kévin Le Gouguec
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: https://orgmode.org * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --firstname.lastname@example.org \ --email@example.com \ --firstname.lastname@example.org \ --email@example.com \ --firstname.lastname@example.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Org-mode mailing list This inbox may be cloned and mirrored by anyone: git clone --mirror https://orgmode.org/list/0 list/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 list list/ https://orgmode.org/list \ email@example.com public-inbox-index list Example config snippet for mirrors. Newsgroups are available over NNTP: nntp://news.yhetil.org/yhetil.emacs.orgmode nntp://news.gmane.io/gmane.emacs.orgmode AGPL code for this site: git clone https://public-inbox.org/public-inbox.git