我在.vimrc中设置了这个映射,效果很好......
" Auto indent entire file
nmap <C-f> gg=G
imap <C-f> <ESC>gg=G
但是,在操作之后,光标已移至第1行第1列。
有没有办法做到这一点,如果我在某个地方的文件中间,光标将保持原样?
答案 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>