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

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

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

До:

a = str "Hello |World"

После:

a = str "Hello 
               |World"

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

2 ответа

Решение

Попробуйте это сопоставление.

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

Когда вы набираете F2 (или любую другую клавишу, выбранную для сопоставления), Vim вставит новую строку (<CR>) с последующим количеством пробелов (<C-R>=repeat(' ',...)) равно разнице между номером столбца конца предыдущей строки (col([line('.')-1,'$'])) и текущий номер столбца (col('.')), тогда выполню :retab в текущей строке, чтобы заменить эти пробелы символами табуляции и / или пробелами в соответствии с настройкой параметра "expandtab".

редактировать

Это отображение требует, чтобы вы были в режиме вставки. Я думал, что вы наберете ключ карты после ввода Hello и перед вводом World. Чтобы вернуться и вставить эту новую строку в обычном режиме, используйте это отображение.

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

У меня нет доступа к копии vim (или даже vi) на данный момент, чтобы проверить это, но попробуйте что-то вроде

iВведитеEsc-Yp:s/./ /gВойтиJ

Что оно делает:

  • Вставьте разрыв строки (ежу понятно).
  • Вернитесь к a = str "Hello линия и сделайте копию этого.
  • Измените каждый символ в скопированной строке на пробел - теперь у вас должно быть 15 пробелов.
  • Присоедините эту строку (15 пробелов) к |World" строка, так что теперь отступ с 15 пробелами.

Возможно, вам придется удалить один пробел (потому что операция соединения может добавить один). Если в строке могут быть вкладки, вы можете добавить !_expandEnter развернуть табуляции до пробелов в копии первой части строки. И вы также можете добавить !_unexpandEnter сжать пробелы до табуляции.

Другие вопросы по тегам