Отображение отступов в Vim: как вставить разрыв строки, чтобы сделать отступ для столбца, в котором я находился?

582
Ein

В Vim я хочу связать клавишу, которая вставит новую строку и сделает отступ этой строки до столбца, где был курсор. Это немного странно, поэтому позвольте мне проиллюстрировать:

Пример: до и после, с курсором в |

До:

a = str "Hello |World" 

После:

a = str "Hello  |World" 

Эта концепция не связана ни с настройками vim 'copyindent', ни 'preserveindent' (эти настройки относятся к первому отступу предыдущей строки, а не к столбцу курсора).

1

2 ответа на вопрос

1
garyjohn

Try this mapping.

:inoremap <F2> <CR><C-R>=repeat(' ',col([line('.')-1,'$'])-col('.'))<CR><C-O>:.retab<CR> 

When you type F2 (or whatever key you choose for the mapping), Vim will insert a newline (<CR>) followed by a number of spaces (<C-R>=repeat(' ',...)) equal to the difference between the column number of the end of the previous line (col([line('.')-1,'$'])) and the current column number (col('.')), then will execute :retab on the current line to replace those spaces by tabs and/or spaces according to your setting of 'expandtab'.

Edit

That mapping requires that you be in insert mode. I was thinking that you would type the map key after typing Hello and before typing World. To go back and insert that newline in normal mode, use this mapping.

nnoremap <F2> i<CR><C-R>=repeat(' ',col([line('.')-1,'$'])-col('.'))<CR><Esc>:.retab<CR> 
0
Scott

I don't have access to a copy of vim (or even vi) at the moment to test this, but try something like

iEnterEsc-Yp:s/./ /gEnterJ

What it does:

  • Insert a line break (no-brainer).
  • Go back up to the a = str "Hello line and make a copy of it.
  • Change every character in the copied line to a space -- so you should now have 15 spaces.
  • Join this line (15 spaces) to the |World" line, so it is now indented 15 spaces.

You might need to delete one space (because the join operation might add one).  If there may be tabs in the line, you might want to add !_expandEnter to expand tabs to spaces in the copy of the first part of the line.  And you might also want to add !_unexpandEnter to compress spaces to tabs.

Я закончил писать это до того, как увидел ответ @ garyjohn. И кстати, это может работать в `vi`. Scott 11 лет назад 0