Как сказать 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>, что не удалось, однако двойная галочка является надежным решением