在Vim中缩进整个文件而不离开当前光标位置

在Vim中缩进整个文件而不离开当前光标位置,vim,indentation,vi,Vim,Indentation,Vi,我已经知道,gg=G可以在Vim上缩进整个文件。但这将使我在缩进后转到文件的开头。如何缩进整个文件并将光标保持在同一位置?您可以使用m命令和字母为当前位置设置书签。然后在运行indent命令后,您可以使用`(backtick)命令返回到该书签,该命令后跟相同的字母 将此添加到您的.vimrc function! Preserve(command) " Preparation: save last search, and cursor position. let _s=@/ let l

我已经知道,
gg=G
可以在Vim上缩进整个文件。但这将使我在缩进后转到文件的开头。如何缩进整个文件并将光标保持在同一位置?

您可以使用m命令和字母为当前位置设置书签。然后在运行indent命令后,您可以使用`(backtick)命令返回到该书签,该命令后跟相同的字母

将此添加到您的.vimrc

function! Preserve(command)
  " Preparation: save last search, and cursor position.
  let _s=@/
  let l = line(".")
  let c = col(".")
  " Do the business:
  execute a:command
  " Clean up: restore previous search history, and cursor position
  let @/=_s
  call cursor(l, c)
endfunction
nmap <leader>> :call Preserve("normal gg>G")<CR>
函数!保存(命令)
准备:保存上次搜索和光标位置。
让我们=@/
设l=直线(“.”)
设c=col(“.”)
“开展业务:
执行:命令
清理:恢复以前的搜索历史记录和光标位置
让我们
调用游标(l,c)
端功能
nmap>:调用保留(“正常gg>G”)
您也可以在任何其他需要的命令上使用此命令,只需将参数更改为preserve函数即可。其思想如下:

请参见
:h'

这将使您返回开始行的第一个字符:

gg=G''
这会让你回到起点和起点栏:

gg=G``

我假设第二个版本是你想要的,带有背景符号。实际上,我通常只使用双撇号版本,因为背景符号在我的键盘上很难访问。

与Alex的回答类似,我在vimrc中使用了以下映射

nnoremap g=:让b:PlugView=winsaveview()gg=g:调用winrestview(b:PlugView):回显“文件缩进”

在正常模式下按
g=
,整个缓冲区缩进,滚动/光标位置保持不变。

在解决方案的顶部,读者也可以使用

在vim脚本中

exe "norm! gg=G\<C-o>"
exe”规范!gg=G\”
或映射

:nnoremap <F10> gg=G\<C-o>
:nnoremap gg=G\

zz太棒了。第二个版本就是我要找的。唯一的缺点是当前行将位于屏幕的末尾。太好了。如果您想在屏幕中间重新定位行,请尝试添加一个
zz
:保持屏幕不变的
gg=G``zz
:mqHmwgg=G`wzt`q。注意它使用
q
>和
w
标记。用
let w=winsaveview()
替换开头的所有let,用
call winrestview(w)
替换结尾的let和call,甚至恢复滚动位置。