1

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

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

До:

a = str "Hello |World"

После:

a = str "Hello 
               |World"

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

2 ответа2

1

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

: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 on текущая строка, чтобы заменить эти пробелы на вкладки и / или пробелы в соответствии с вашей настройкой 'expandtab'.

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

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .