在Vim中,我可以格式化一个完整的文件并在它开始的地方以光标结束吗?
我在我的.vimrc中设置了这个映射,它工作得很好在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)要返回该位
" 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>