Нажатие Home в Vim на строке с отступом

У меня есть плохая привычка использовать клавишу «домой», чтобы вернуться к началу строки. Поскольку я недавно начал использовать vim, я заметил, что когда я нажимаю клавишу «Домой» на строке с отступом, она возвращает меня в самое начало строки. В Notepad++ (редактор, который я использовал) он возвращал меня к началу кода в этой строке, сразу после отступа.

Есть ли способ воспроизвести это поведение в vim? Обычно, когда я нажимаю домой, я нахожусь в режиме вставки, чтобы (обычно) вставить туда переменную.

У меня есть set smartindent в моем vimrc, с set noautoindent в качестве страницы «советов» мне было сказано обязательно отключить автоотступ (хотя, похоже, он изначально не был включен - возможно, этот параметр является посторонним.)


person Reid    schedule 10.01.2010    source источник


Ответы (5)


Есть два обычных способа перейти к «началу» строки в Vim:

  • 0 (ноль) перейти к первому столбцу текста
  • ^ перейти к первому непробельному символу в строке

Я обнаружил, что использование 0w обычно является для меня наиболее удобным способом перейти к первому непустому символу в строке, это то же количество ключей, что и ^ и до него легче добраться. (Конечно, если в строке нет начальных пробелов, не нажимайте w.)

person Greg Hewgill    schedule 10.01.2010
comment
Итак, нет способа сделать это в режиме вставки? Думаю, мне следует привыкнуть к переключению между ними. - person Reid; 10.01.2010
comment
Я не думаю, что есть способ; Я вообще не использую перемещение курсора в режиме вставки. Эта статья может быть полезна: viemu.com/a-why-vi-vim. html - person Greg Hewgill; 10.01.2010
comment
@Reid - Вы, вероятно, могли бы так или иначе отобразить это (см. Ниже) - но все движения действительно должны выполняться в режиме N, а не в I. - person Rook; 10.01.2010
comment
Ага, это правда. Думаю, со временем я к этому привыкну. Спасибо за помощь - person Reid; 10.01.2010

Вы можете переназначить Home так, чтобы он совпадал с ^ (в документах говорится, что функция Home по умолчанию эквивалентна команде перемещения 1). |):

:map <Home> ^  
:imap <Home> <Esc>^i  

Что должно сделать сопоставление режима вставки эквивалентным выходу из режима вставки, нажатию ^ и последующему возврату в режим вставки. Я не знаю наилучшего метода сопоставления команды движения для использования в режиме вставки, поэтому это может что-то сломать, но, похоже, это работает.

Что касается ваших настроек отступов, они не должны влиять на элементы управления движением, но я также думаю, что вы, вероятно, предпочтете, чтобы они были установлены по-другому. autoindent просто сохраняет ваш текущий отступ для новых строк (поэтому, если вы поместите 4 пробела в начале строки, после того, как вы нажмете клавишу возврата, ваша новая строка также будет иметь 4 пробела перед ней). Я не знаю, почему вы этого не хотите, поскольку это очень полезно практически на любом языке программирования или даже просто в произвольном тексте. smartindent, с другой стороны, реализует пару жестко запрограммированных правил отступов в стиле C, таких как отступ после открытия { и удаление отступа после закрытия }, но не переносит автоматически отступ из предыдущих строк. В документации рекомендуется оставить включенным автоматический отступ, если вы используете умный отступ.

Однако smartindent бесполезен для языков, которые не соответствуют его жестко закодированным правилам, или даже активно вреден (например, когда он автоматически удаляет отступы из любой строки, начинающейся с «#», что, по его мнению, является директивой препроцессора, но неверно для программисты на Python, пытающиеся написать комментарий с отступом).

Таким образом, vim также включает более продвинутый режим отступа, отступ типа файла, который позволяет использовать гибкие правила отступа для каждого языка/типа файла и является предпочтительным режимом отступа для большинства людей (даже для C-подобных языков). Если вы используете отступ типа файла, лучше отключить smartindent (в противном случае он может помешать отступу типа файла, например, перемещение всех строк комментариев в столбец 0 в файлах Python).

Лично я всегда включаю автоматический отступ, использую тип файла, когда он доступен, и никогда не использую умный отступ. Мой .vimrc включает в себя:

set autoindent " doesn't interfere with filetype indents, and is useful for text  
if has("autocmd")  
  " Enable file type detection and indentation  
  filetype plugin indent on  
  set nosmartindent  
endif  

Я предполагаю, что вы могли бы что-то сделать, чтобы smartindent включался только тогда, когда отступ типа файла не существует для типа файла, если вы редактируете столько разных C-подобных языков без доступного отступа типа файла.

person Jeffson    schedule 16.02.2010
comment
вы можете сократить карту режима вставки на символ, сказав imap <Home> <ESC>I вместо ^i - person Ryan Haining; 13.07.2012

Вот что у меня есть в моем .vimrc. Это отображает Home для перехода к началу текста, если вы находитесь в любом месте строки, и к столбцу 0, если вы находитесь в начале текста.

function ExtendedHome()
    let column = col('.')
    normal! ^
    if column == col('.')
        normal! 0
    endif
endfunction
noremap <silent> <Home> :call ExtendedHome()<CR>
inoremap <silent> <Home> <C-O>:call ExtendedHome()<CR>

Примечание. Я использую раскладку клавиатуры, которая сопоставляет Home с Alt Gr+A, поэтому я используя это. Если вам нужно выйти из поля букв на клавиатуре, чтобы добраться до Home, вам, вероятно, следует вместо этого перейти в обычный режим.

person Chronial    schedule 17.03.2013

Вы также можете использовать _ в обычном режиме, чтобы перейти к первому непробельному символу текущей строки. Вы также можете использовать счет с этим движением.

_  <underscore>     [count] - 1 lines downward,
                    on the first non-blank character linewise.
person Stefan van den Akker    schedule 28.07.2015

Попробуйте нажать 0 (см. также :help 0)

также, это может помочь:

:imap <C-Home> <esc>0a
person Rook    schedule 10.01.2010