Отображение отступов в 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
сжать пробелы до табуляции.