Emacs mini-buffer command with parameter - emacs

I'd like to use the command to resize split windows via the mini-buffer. In the GNU documentation I found the description (Resizing-Windows):
Example: enlarge-window-horizontally size &optional horizontal.
If I type M-x enlarge-window-horizontally the window will get resized by one column. But it is not possible to add a number for the size in the mini-buffer, as on pressing spacebar emacs tries to complete the command.
Does someone know how to use the optional parameters in mini-buffer? Respectively how to resize a window by more than one column at once.
Thanks.

Passing parameters to interactive command like this uses the universal argument.
You can enlarge the window by 10 columns by typing C-u 10 M-x enlarge-window-horizontally. You can change 10 to any integer. By the way, typing C-u num to supply a numeric argument works with all interactive emacs commands that expect an argument.
Note there is also a keyboard short cut: C-u 10 C-x }.
And to shrink the window: C-u 10 C-x {.
You can also specify numbers by typing holding down the meta key M-10 C-x {

What you are looking for is eval-expression.
M-: (enlarge-window-horizontally horizontal)
M-: will change the minibuffer to an eval prompt that lets you enter in a Lisp expression to be evaluated.

Related

How to uncomment blocks code in emacs

I am using emacs with the major mode "Java/L Abbrev" activated. When I type M-x comment-region or M-x uncomment-region the desired effects happen in the editor. But I am getting tired of typing this out every time.
I have found that I can type C-c C-c and comment a region. I want to find a similiar way to uncomment a region. I go to the emacs docs:
https://www.gnu.org/software/emacs/manual/html_node/ccmode/Comment-Commands.html
And it says to give the C-c C-c command a negative argument to uncomment lines. How do I do this? or is there a better way?
Please try M-;, which is bound by default to comment-dwim. I think this should do what you want.
comment-dwim (DWIM stands for "Do What I Mean") is bound to M-; by default and works differently depending on whether or not the region is active (and sometimes what mode you're in)
From the emacs help page for comment-dwim:
comment-dwim is an interactive compiled Lisp function in
‘newcomment.el’.
It is bound to M-;.
(comment-dwim ARG)
Call the comment command you want (Do What I Mean).
If the region is active and ‘transient-mark-mode’ is on, call
‘comment-region’ (unless it only consists of comments, in which
case it calls ‘uncomment-region’).
Else, if the current line is empty, call ‘comment-insert-comment-function’
if it is defined, otherwise insert a comment and indent it.
Else if a prefix ARG is specified, call ‘comment-kill’.
Else, call ‘comment-indent’.
You can configure ‘comment-style’ to change the way regions are commented.
Your question is how to use C-c C-c to uncomment the region.
#AaronHarris answered your question about using a negative prefix arg.
But I think you misread the doc of comment-region (which CC mode binds to C-c C-). It does not uncomment the region. It deletes a certain number of comment characters.
To uncomment the region you use C-u - a plain prefix arg (no explicit number) to uncomment the region. C-h f comment-region says:
comment-region is an interactive compiled Lisp function in
newcomment.el.
It is bound to menu-bar edit region comment-region.
(comment-region BEG END &optional ARG)
Comment or uncomment each line in the region.
With just C-u prefix arg, uncomment each line in region BEG .. END.
Numeric prefix ARG means use ARG comment characters.
If ARG is negative, delete that many comment characters instead.
The strings used as comment starts are built from comment-start
and comment-padding; the strings used as comment ends are built
from comment-end and comment-padding.
By default, the comment-start markers are inserted at the
current indentation of the region, and comments are terminated on
each line (even for syntaxes in which newline does not end the
comment and blank lines do not get comments). This can be
changed with comment-style.
So the answer is to use C-u C-c C-c.
And FWIW, comment-region is much better than M-; (comment-dwim) for commenting and uncommenting the region. It lets you nest and unnest comment blocks any number of levels.
TLDR: Use C-- C-c C-c; i.e., prefix your command with "control-hyphen"
To give a negative argument to a command, you need to call either the negative-argument command or the universal-argument command, supplying a negative argument. (Try C-h f for more information on these.)
The negative-argument command is bound to keys C--, M--, and C-M--, so all of these will work as prefixes; generally, you'll use the one that's most convenient to type for any given command.
The universal-argument command is bound to C-u and accepts its argument immediately after that, so you can also do C-u -, optionally followed by zero or more digits (e.g., C-u - 5 3 9); that one is overkill here, but good to know about.
Finally, here is the section of the Emacs manual that discusses this topic.
Why not mapping the uncomment-region command to a key? It's not really what you were asking for (previous answer are better for this) but it's a way to stop typing M-x uncomment-region every time
like this (with the key binding you want)
(global-set-key (kbd "C-c C-u") 'uncomment-region)
Documentation about key binding can be found here:
Commands for Binding Keys
Customizing Key Bindings
Here is a map of command:
Map of command
You can use C-h k (M-x describe-key) to show what command is bind to a particular key (so you're sure to not erase it) and C-h f (M-x describe-function) will show you a description of the function + its binding.
First, select the region
To comment, use
ALT + x comment-region
To un-comment, use
ALT + x uncomment-region
Credits: https://www.reddit.com/r/emacs/comments/1kklgl/command_to_uncomment_entire_comment_block/

In Emacs, how do I select the completion list with the keyboard?

When I tab-complete in a minibuffer and Emacs displays a completion list in a new buffer, how do I switch to that buffer without using the mouse?
I tried C-x o, but that just switched to the first buffer, out of which I entered the minibuffer.
I also tried C-x b, but that gives me command attempted to use minibuffer while in minibuffer.
Lastly I tried C-x <C-right>, which gives me cannot switch buffers in minibuffer window.
EDIT: I spoke about minibuffer completion in my example, but being able to access the completion list (using the keyboard) from within a regular buffer is also important to me, and not working. The M-v shortcut was suggested, but it only seems to work inside the minibuffer accessed by M-x, in every other buffer I've tried, M-v is bound to scroll down command and does not switch to the completion list. I doesn't even seem to work in other minibuffers. For example, it doesn't work in the shell command minibuffer invoked by M-! either.
You can use M-v (documented here) which switches to the completion buffer and puts the cursor on the first completion:
Typing M-v, while in the minibuffer, selects the window showing the
completion list (switch-to-completions). This paves the way for using
the commands below. <PageUp> or <prior> does the same. You can also
select the window in other ways...
EDIT: It looks like based on your edit to the original question that what you're asking for is a way to switch to the completions buffer more globally. There is a function switch-to-completions that selects the completions list - you might consider binding that function to a key of your choosing, e.g.:
(define-key global-map (kbd "C-x t") 'switch-to-completions)
For example, such a binding allows me to switch to completions from "Shell command: " invoked by M-!, and places the cursor on the first possible completion.
You can use C-xo twice, or use M--C-xo, which switches to the previous buffer instead of the next one.

How can I open multiple minibuffers in emacs?

Say I'm entering a command in the minibuffer, and I realize that I need to remember the path to some file as a param to my command. Can I instead of cancelling the command I started entering to do C-x d or to go to a shell, click (click? what's that?) on a secondary mini buffer to run such command?
You are looking for "recursive editing", specifically the bit discussed in the Recursive Minibuffer docs:
(setq enable-recursive-minibuffers t)
(minibuffer-depth-indicate-mode 1)
The latter line makes things the recursive editing less confusing, by showing the level of recursion. E.g C-x C-f then C-x b will appear like this:

eshell Doesn't Honor display-buffer

I use display-buffer C-x 4 C-o to set a buffer to the other window. This works great unless I want to put my eshell buffer in the other window. eshell puts itself in my current window every time.
If I prefix the command with C-u eshell switches properly. Is there a way I can make that the default?
Just do this:
(eval-after-load "eshell"
'(eshell-remove-from-window-buffer-names))
As pmr said, defadvice seems like what you want. Just wrap the function and pass an argument to it every time. Here is the link to the gnu docs on defadvice.
http://www.gnu.org/s/emacs/manual/html_node/elisp/Simple-Advice.html#Simple-Advice

Emacs C-h c doesn't seem to work for chords 3 combinations long?

I'm trying to use C-h c in emacs to figure out what a key combination is bound to. The combination is C-u C-c C-q, which realigns tags in org-mode. However, Emacs just tries to look up C-u C-c and then fails. What am I doing wrong? I realize I could easily look at the orgmode source or something to figure this out, but for future reference what would I do to figure out what function something like this is bound to?
Edit: OK, so it's actually C-u followed by C-c C-q, and according to emacs this is what that combination is bound to:
(org-set-tags-command &optional arg just-align)
Call the set-tags command for the current entry.
So what exactly does it mean to give this command the argument 4?
Oh, just to give an explanation: I'm trying to start learning emacs-lisp and customization and one of the things I wanted to do was to have this command added to the before-save-hook so that when I save an org file, the tags get automatically aligned.
Final edit: I figured out why this command behaves as it does; given the prefix argument it changes its behavior. How can I set the prefix argument when calling the function in elisp?
It's not a general problem with combinations that are three keys long: For example, C-h c ESC ESC ESC (keyboard-escape-quit) or C-h c C-x r t (string-rectangle) both work fine.
When I try C-h c C-u C-c C-q in org-mode, the command interrupts after C-u and shows:
C-u runs the command universal-argument
in the minibuffer, which is correct. So, in fact, "C-u C-c C-q" is not a command, it's the command "C-c C-q" (org-table-wrap-region) started with an additional argument (4 -- see C-h k C-u for an explanation).