9

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

我的 .vimrc 文件:

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

有没有办法创建这样的命令快捷方式并用:x(保存+退出)覆盖。

请告诉我。

4

3 回答 3

17

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

于 2013-04-14T00:14:34.080 回答
7

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

set autoindent

通过 阅读文档:help autoindent

但是,该=命令将根据文件类型的规则缩进行。您可以创建一个BufWritePre自动命令来对整个文件执行缩进。

我没有对此进行测试,也不知道它的实际效果如何:

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
于 2013-04-13T20:00:36.987 回答
2

要缩进已经存在的文件,您可以使用快捷方式gg=G(不是命令;只需按g两次,然后按 ,=然后按Shift+g),特别是因为您使用的是filetype indent... 行。

Vim: gg=G 左对齐,不自动缩进

于 2013-04-14T03:39:52.927 回答