Как сказать vim для автоматического отступа перед сохранением

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

Мой файл.vimrc:

set expandtab
set tabstop=2
set shiftwidth=2
set softtabstop=2
set pastetoggle=<F2>
syntax on
filetype indent plugin on

Есть ли способ создать такие сочетания клавиш и переопределить с помощью: х (сохранить + выход).

Пожалуйста, дайте мне знать.

4 ответа

Добавьте следующее к вашему .vimrc:

" Restore cursor position, window position, and last search after running a
" command.
function! Preserve(command)
  " Save the last search.
  let search = @/

  " Save the current cursor position.
  let cursor_position = getpos('.')

  " Save the current window position.
  normal! H
  let window_position = getpos('.')
  call setpos('.', cursor_position)

  " Execute the command.
  execute a:command

  " Restore the last search.
  let @/ = search

  " Restore the previous window position.
  call setpos('.', window_position)
  normal! zt

  " Restore the previous cursor position.
  call setpos('.', cursor_position)
endfunction

" Re-indent the whole buffer.
function! Indent()
  call Preserve('normal gg=G')
endfunction

Если вы хотите, чтобы все типы файлов автоматически сохранялись при сохранении, что я настоятельно рекомендую, добавьте этот хук к .vimrc:

" Indent on save hook
autocmd BufWritePre <buffer> call Indent()

Если вы хотите, чтобы только определенные типы файлов автоматически сохранялись при сохранении, что я рекомендую, то следуйте инструкциям. Допустим, вы хотите, чтобы файлы C++ автоматически вставлялись при сохранении, а затем создайте ~/.vim/after/ftplugin/cpp.vim и положите этот крюк там:

" Indent on save hook
autocmd BufWritePre <buffer> call Indent()

То же самое относится и к любым другим типам файлов, т.е. ~/.vim/after/ftplugin/java.vim для Java и так далее.

Я бы порекомендовал включить autoindent чтобы избежать этой проблемы в первую очередь. На каждом этапе разработки работать с правильно написанным кодом гораздо проще.

set autoindent

Читайте документы через :help autoindent,

Тем не менее, команда = будет выравнивать строки в соответствии с правилами типа файла. Вы можете создать BufWritePre autocmd, чтобы выполнить отступ для всего файла.

Я не проверял это, и не знаю, насколько хорошо это будет работать на самом деле:

autocmd BufWritePre * :normal gg=G

Читать :help autocmd для получения дополнительной информации по теме. gg=g разбивается как:

  • :normal выполнять как обычную команду редактирования режима, а не как :ex команда
  • gg перейти к началу файла
  • = отступ до...
  • G... конец файла.

Я действительно не рекомендую эту стратегию все же. Привыкнуть к использованию set autoindent вместо. Вероятно, неразумно определять это autocmd на всех файлах (как с *). Это можно сделать только для определенных типов файлов:

" Only for c++ files, for example
autocmd BufWritePre *.cpp :normal gg=G

Чтобы сделать отступ для файла, который уже существует, вы можете использовать ярлык gg=G (не команда; просто нажмите g затем =, затем Shift+g), особенно если вы используете filetype indent... линия.

Vim: gg = G выравнивает по левому краю, без автоматического отступа

я бы пошел с

      autocmd BufWritePre * :normal gg=G``

Это приведет к отступу всего файла и возврату к последней позиции курсора.

  • пытался добавить <Co> <Co>, что не удалось, однако двойная галочка является надежным решением
Другие вопросы по тегам