45

I am writing python code so shifting/moving blocks of lines is important to avoid going through each line individually. How can I do this without an add-on? Is there a type of operation keystroke command to do this?

1

5 Answers 5

73

Use command indent-rigidly, which is bound to C-x TAB by default.

You can specify the number of spaces to indent by using a prefix argument, such as C-5 C-x TAB.

Or you can invoke the command and then use the left/right arrows to interactively adjust the indent level.

7
  • how do you add a prefix argument? Commented Feb 21, 2015 at 18:46
  • 2
    Try for example C-5 C-x TAB to indent the current region 5 spaces. Commented Feb 21, 2015 at 18:51
  • great, but why does the first line not move as well? I have to grab the last part of the line above the selection to make the set of lines I want move. Commented Feb 21, 2015 at 18:52
  • 1
    You shouldn't need to select anything from the previous line, but you do want to select from the beginning of the first line you want to indent. For example, C-a to move to the beginning of the line, C-SPC to start marking the region, C-n C-n to move down a couple lines, C-5 C-x TAB to indent those two lines. Commented Feb 21, 2015 at 18:56
  • 1
    "use the left/right arrows to interactively adjust the indent level" Really? Great! I didn't know this, and sometimes I had to guess how much spaces I need to add or remove. I hope this can help. Commented Feb 21, 2015 at 19:02
15

If you are used python-mode.el C-c > or C-c < to shift blocks left or right

3
  • how come the first line of the selection remains unmoved if I don't select the last part of the line above it? Commented Feb 21, 2015 at 18:50
  • I cannot reproduce this behaviour. all line of a selections are moved. Emacs 24.4 Commented Feb 21, 2015 at 18:54
  • glucas' comment says that this will happen if you don't select from the start of the line Commented Feb 21, 2015 at 21:39
9

The string-rectangle command ( C-x r t) can be used to insert any arbitrary text (spaces included) in a selected region.

Let's say you have this block of text and you want to insert 5 spaces in front of all lines.

abc def ghi 

First select a "0 column" region as shown below (the point is on the character 'a' and the mark is in the same column in the row containing 'ghi':

▮bc def ▯ ghi 

Now using string-rectangle, insert the text you want to insert in the selected region. In this example, we will be inserting 5 spaces on all the rows including and inbetween the point and the mark.

C-x r t M-5 SPC RET 

That will give the below force indented text.

 abc def ghi 
6

There is C-x TAB (bound to indent-rigidly). Give it a prefix argument to indicate how many spaces you wish to indent by, negative removes that many spaces.

1

I found that by pressing Alt-4 and then SPC, I get the desired result. Not sure if this is the best way, but it works as well.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.