Inside org-mode, RETURN is bound to (org-return &optional INDENT). This command apparently ignores C-u numeric prefixes and so if you want to enter 10 newlines, you can't just type C-u 1 0 RET and have it work. You can do C-u 1 0 M-x newline and get expected behavior, but I would like to know if there's a simpler set of default keystrokes?
- 21,702
- 4
- 53
- 89
- 195
- 7
3 Answers
If you just want to insert newlines, without any automation for indentation or support for soft newlines, then you can use quoted-insert (C-q), which lets you enter any character including control characters. A newline character is C-j, but the Return key sends C-m, so you need to type C-u 1 0 C-q C-j (insert a newline, times 10).
If you want to call the newline function, you can advise org-return. Untested.
(defadvice org-return
(around org-return-prefix-argument (&optional indent arg) activate compile)
(interactive (list nil current-prefix-arg))
(letf (((symbol-function 'true-newline) (symbol-function 'newline)
(symbol-function 'newline) (lambda () (true-newline arg))))
ad-do-it))
- 21,702
- 4
- 53
- 89
-
There shouldn't be any need to advise (or redefine) `org-return` in this case, unless I'm missing something. That's overkill - just define your own command to do what you want, and bind that to `RET`. – Drew Oct 23 '14 at 17:04
-
@Drew The point is to use the prefix argument only in the cases when `org-return` would insert a newline, and not affect the other cases (in tables, etc.) – Gilles 'SO- stop being evil' Oct 23 '14 at 17:06
-
Is `org-return` used only as a command (not used in Lisp code)? Or if it is used also in Lisp code, should what is requested *not* affect also that code? If so, then why can't you just define a new command to do what you want, and not change `org-return`? The prefix-arg behavior should not enter into the question of what command to use, but only what the command should do. – Drew Oct 23 '14 at 17:09
-
@Drew I didn't check, I think it's only intended for interactive use. I chose to implement a semantics where `C-u RET` in a table would do the same thing as before and ignore the prefix argument. This requires going through the `cond` inside `org-return`. The other semantics where specifying a prefix argument forces the insertion of newlines makes sense and would not call for an advice-based implementation, it's just not what I chose to implement. – Gilles 'SO- stop being evil' Oct 23 '14 at 17:16
-
@Gilles `org-return` is used in `org-return-indent` in org.el. But that shouldn't affect it as you added `arg` as the last argument, correct? – Kaushal Modi Oct 23 '14 at 17:51
-
OK. There are certainly many ways to skin a cat! It's probably good to mention such considerations (the things you checked, the things I mentioned, etc.). – Drew Oct 23 '14 at 17:54
Here's another solution:
(defun my-org-return (&optional arg indent) (interactive "*p") (dotimes (number arg) (org-return indent))) (define-key org-mode-map (kbd "<return>") 'my-org-return)
- 25,203
- 3
- 74
- 179
-
This is probably better than the other rebinding since it won't require updating the redefined function with any changes that are made in future releases of org. – William Everett Oct 23 '14 at 16:59
-
It is always preferable to use your own command instead of advising or redefining another command - *if* you get the desired behavior by doing that, and if other things are equal. – Drew Oct 23 '14 at 17:02
You can redefine org-return and org-return-indent as follows in your init.el (I have redefined the function found in emacs/24.4/lisp.org/org.el:
After the redefinition, you can do C-u10RET.
(defun org-return (&optional arg indent)
"Goto next table row or insert a newline.
Calls `org-table-next-row' or `newline', depending on context.
See the individual commands for more information.
With ARG, call `org-return' that many times."
(interactive "P")
(let (org-ts-what)
(cond
((or (bobp) (org-in-src-block-p))
(if indent (newline-and-indent) (newline arg)))
((org-at-table-p)
(org-table-justify-field-maybe)
(call-interactively 'org-table-next-row))
;; when `newline-and-indent' is called within a list, make sure
;; text moved stays inside the item.
((and (org-in-item-p) indent)
(if (and (org-at-item-p) (>= (point) (match-end 0)))
(progn
(save-match-data (newline arg))
(org-indent-line-to (length (match-string 0))))
(let ((ind (org-get-indentation)))
(newline arg)
(if (org-looking-back org-list-end-re)
(org-indent-line)
(org-indent-line-to ind)))))
((and org-return-follows-link
(org-at-timestamp-p t)
(not (eq org-ts-what 'after)))
(org-follow-timestamp-link))
((and org-return-follows-link
(let ((tprop (get-text-property (point) 'face)))
(or (eq tprop 'org-link)
(and (listp tprop) (memq 'org-link tprop)))))
(call-interactively 'org-open-at-point))
((and (org-at-heading-p)
(looking-at
(org-re "\\([ \t]+\\(:[[:alnum:]_@#%:]+:\\)\\)[ \t]*$")))
(org-show-entry)
(end-of-line 1)
(newline arg))
(t (if indent (newline-and-indent) (newline arg))))))
Note that in newline-and-indent, the ARG input of newline is set to nil. So the same is done in the renewed definition of org-return-indent.
(defun org-return-indent () "Goto next table row or insert a newline and indent. Calls `org-table-next-row' or `newline-and-indent', depending on context. See the individual commands for more information." (interactive) (org-return nil t))
- 25,203
- 3
- 74
- 179
-
Why *redefine the command* that `RET` is bound to by default in `org-mode`, instead of just binding `RET` to the command that you want? IOW, it the behavior you code is what is wanted, why not call that command `my-org-return` and bind it to `RET` in `org-mode`? – Drew Oct 23 '14 at 16:37
-
-
@Drew Thanks for the nudge; I've added another answer that should do exactly the same as this one. I yet have to venture into using defadvices. – Kaushal Modi Oct 23 '14 at 16:56
-
You can also delete this answer and leave just the other one, if you like. (Or you can leave it, if you think it or the comments are helpful.) – Drew Oct 23 '14 at 17:01