Нажатие "Home" в Vim на отступом
У меня плохая привычка использовать ключ "home", чтобы вернуться к началу строки. Поскольку я недавно начал использовать vim, я заметил, что когда я нажимаю домашний ключ на выровненном отступе, он возвращает меня к самому началу строки. В Notepad ++ (редактор, который я использовал) он возвращал меня к началу кода на этой строке сразу после отступа.
Есть ли способ воспроизвести это поведение в vim? Обычно, когда я нажимаю его в режиме Вставки для меня (обычно), вставьте переменную там.
У меня есть set smartindent
в моем vimrc, с set noautoindent
как страница "советы" мне сказали, чтобы отключить автоинденс (хотя он, похоже, не был включен в первую очередь - возможно, этот параметр является посторонним.)
Ответы
Ответ 1
Есть два обычных способа перейти к "началу" строки в Vim:
- 0 (ноль) перейти к первому столбцу текста
- ^ перейти к первому непробелому пробелу в строке
Я считаю, что использование 0 w обычно является наиболее удобным способом перехода к первому непунктовому символу в строке, ему столько же ключей, сколько ^, и его легче достичь. (Конечно, если на строке нет начальных пробелов, не нажимайте w.)
Ответ 2
Вы можете переназначить Home так же, как ^ (функция docs говорит, что функция Home по умолчанию эквивалентна команде перемещения 1 |):
:map <Home> ^
:imap <Home> <Esc>^i
Что должно сделать отображение режима вставки эквивалентным выходу из режима вставки, нажав ^, а затем вернется в режим вставки. Я не знаю о лучшем методе отображения команды движения для использования внутри режима вставки, поэтому это может сломать что-то, но, похоже, оно работает.
Что касается настроек отступов, они не должны влиять на элементы управления движением, но я также думаю, что вы, вероятно, предпочли бы, чтобы они устанавливались по-разному. autoindent просто сохраняет ваш текущий отступ для новых строк (так что если вы поместите 4 пробела в начале строки, после того, как вы нажмете клавишу, у вашей новой линии также будет 4 пробела перед ней). Я не знаю, почему вы этого не хотели, поскольку он очень полезен практически для любого языка программирования или даже для текста свободной формы. smartindent, с другой стороны, реализует пару жестко закодированных правил C-ish отступов, таких как отступы после открытия {и дезактивация после закрытия}, но не автоматически переносит отступ из предыдущих строк. Документы рекомендуют поддерживать автоматическое нажатие, если вы используете smartindent.
Однако smartindent бесполезен для языков, которые не соответствуют его жестко закодированным правилам или даже активно вредны (например, когда он автоматически удаляет отступы из любой строки, начинающейся с "#", что, по его мнению, является директивкой препроцессора, но неправильно для программистов python, пытающихся написать комментарий с отступом).
Таким образом, vim также включает более продвинутый режим отступов, отступы типа файла, который позволяет использовать гибкие правила отступов на основе каждого языка/типа файла и является предпочтительным режимом отступов для большинства людей (даже для C-подобных языков). Если вы используете отступы типа filetype, лучше отключить smartindent (в противном случае он может помешать отступутию типа файла, например, перемещать все строки комментариев в столбец 0 в файлах python).
Лично у меня всегда включен аутодант, используйте тип файла, когда он доступен, и никогда не используйте smartindent. Мой .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, только если для типа файла не существует отступы типа filetype, если вы редактируете множество разных C-подобных языков без отступа от типа файла.
Ответ 3
Вот что у меня в моем .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, вы должны перейти в обычный режим.
Ответ 4
Вы также можете использовать _
в нормальном режиме, чтобы перейти к первому небезвестному символу текущей строки. Вы также можете использовать счетчик с этим движением.
_ <underscore> [count] - 1 lines downward,
on the first non-blank character linewise.
Ответ 5
Попробуйте нажать 0
(также см. :help 0
)
это может помочь:
:imap <C-Home> <esc>0a