在Vim中,我可以格式化一个完整的文件并在它开始的地方以光标结束吗?

在Vim中,我可以格式化一个完整的文件并在它开始的地方以光标结束吗?,vim,Vim,我在我的.vimrc中设置了这个映射,它工作得很好 " Auto indent entire file nmap <C-f> gg=G imap <C-f> <ESC>gg=G “自动缩进整个文件 nmap gg=G imap gg=G 但是,操作完成后,光标已移动到第1行第1列 有没有办法这样做,如果我在文件的中间,光标将保留在哪里?为什么不使用 MA< /代码>在缓冲区 A/中标记当前位置,并且在转换后使用“A(即:后台代码>代码> + a)要返回该位

我在我的.vimrc中设置了这个映射,它工作得很好

" Auto indent entire file
nmap <C-f> gg=G
imap <C-f> <ESC>gg=G
“自动缩进整个文件
nmap gg=G
imap gg=G
但是,操作完成后,光标已移动到第1行第1列


有没有办法这样做,如果我在文件的中间,光标将保留在哪里?

为什么不使用<代码> MA< /代码>在缓冲区<代码> A/<代码>中标记当前位置,并且在转换后使用“A<代码>(即:<代码>后台代码>代码> +<代码> a)要返回该位置,请使用标记移动。

当然,请使用标记(
:help mark
):

nmap mtgg=G't
imap

执行
gg=G
之前,当前光标位置将保存到标记
t
。操作后,
't
跳回标记。

Brian的上述解决方案适用于宏,但作为一个好提示,请注意Ctrl+O将转到跳转列表中的上一个光标位置。因此,如果您执行了移动的操作然后,您可以返回到上一个位置。

Ctrl+O有助于返回跳转列表。“”将使您返回跳转列表中的最后一行(或“`返回到最后一行和最后一列)

不幸的是,没有“整个缓冲区”文本对象,因此,
gg=G
需要向后移动跳转列表中的两个位置。

正如jamessan所写,Ctrl+o跳转回跳转列表中的最后一个位置。调用gg=G后,必须调用两次

因此,可以使用不带标记的映射:

map <silent> <C-f> gg=G<C-o><C-o>
imap <silent> <C-f> <Esc> gg=G<C-o><C-o>
map gg=G
imap gg=G

常规引号字符“也可以使用,而且比backtickUsing”更容易键入。返回标记只会使您返回到标记的行和列。`将使您返回到标记的行和列。或者更优雅,
:nnoremap 1G=G`
map <silent> <C-f> gg=G<C-o><C-o>
imap <silent> <C-f> <Esc> gg=G<C-o><C-o>