如何让Vim在保存前自动缩进

lpwwtiir  于 2022-11-11  发布在  其他
关注(0)|答案(4)|浏览(203)

我 最近 开始 使用 Vim 来 完成 我 的 研究 生 项目 。 我 面临 的 主要 问题 是 有时 我 签 入 未 缩进 的 代码 。 我 觉得 如果 我 能 以 某种 方式 创建 一 个 自动 缩进 + 保存 + 关闭 的 快捷 方式 , 那么 应该 可以 解决 我 的 问题 。
我 的 . vimrc 文件 :

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

中 的 每 一 个
有 没有 办法 创建 这样 的 命令 快捷 方式 & override with :x ( 保存 + 退出 ) 。
请 告诉 我 。

ioekq8ef

ioekq8ef1#

将以下内容添加到您的.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 for Java等。

xxe27gdn

xxe27gdn2#

我建议首先打开autoindent来避免这个问题。在开发的每个阶段使用适当缩进的代码要容易得多。

set autoindent

通过:help autoindent阅读文档。
但是,=命令会根据文件类型的规则缩进行。您可以创建一个BufWritePre autocmd来对整个文件执行缩进。
我还没有测试过这个,也不知道它实际上会如何工作:

autocmd BufWritePre * :normal gg=G

有关该主题的详细信息,请阅读:help autocmdgg=g分解为:

  • :normal作为正常模式编辑命令而不是:ex命令执行
  • gg移动到文件的顶部
  • =缩进直到...
  • G ......文件结束。

不过我真的不推荐这种策略。习惯使用set autoindent来代替。在所有文件上定义autocmd可能是不明智的(就像*一样)。只能在某些文件类型上这样做:

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

06odsfpq3#

要缩进已经存在的文件,可以使用快捷键gg=G(不是命令;只需按g两次,然后按=,再按Shift+g),特别是因为您使用的是filetype indent...行。
Vim: gg=G aligns left, does not auto-indent

m0rkklqb

m0rkklqb4#

I would go with

autocmd BufWritePre * :normal gg=G``

Such will indent whole the file and get back to the recent cursor position.

  • did tried to add which failed, however double tick is a robust solution

相关问题