Нажатие «Домой» в Vim с отступом - PullRequest
15 голосов
/ 10 января 2010

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

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

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

Ответы [ 5 ]

29 голосов
/ 10 января 2010

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

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

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

13 голосов
/ 16 февраля 2010

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

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

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

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

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

Таким образом, vim также включает в себя более продвинутый режим отступа, отступ типа файла, который позволяет гибкие правила отступа для каждого языка / типа файла и является предпочтительным режимом отступа для большинства людей (даже для языков, подобных C). Если вы используете отступ типа файла, лучше отключить 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 был включен только тогда, когда для типа файла не существует отступа для типа файла, если вы редактируете много разных C-подобных языков без отступа для типа файла.

7 голосов
/ 17 марта 2013

Вот что у меня есть в .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 , вам, вероятно, следует перейти в обычный режим.

2 голосов
/ 28 июля 2015

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

_  <underscore>     [count] - 1 lines downward,
                    on the first non-blank character linewise.
1 голос
/ 10 января 2010

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

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

:imap <C-Home> <esc>0a
...