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

时间:2009-10-29 21:59:54

标签: vim

我在.vimrc中设置了这个映射,效果很好......

" Auto indent entire file
nmap <C-f> gg=G
imap <C-f> <ESC>gg=G

但是,在操作之后,光标已移至第1行第1列。

有没有办法做到这一点,如果我在某个地方的文件中间,光标将保持原样?

5 个答案:

答案 0 :(得分:5)

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

nmap <C-f> mtgg=G't
imap <C-f> <ESC><C-f>

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

答案 1 :(得分:4)

Ctrl + O 适合回溯跳转列表。 ' '会将您移回跳转列表中的最后一行(或` `返回最后一行和一列)。

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

答案 2 :(得分:2)

为什么不使用ma标记缓冲区a中的当前位置,并在转换后使用``a (i.e.反引号+ a`)返回到位置? Here's an article使用标记移动。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

正如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>