我的按键映射〜/.vimrc动态重新缩进编辑的源代码的文件。它看起来如下:
" press F4 to fix indentation in whole file; overwrites marker 'q' position
noremap <F4> mqggVG=`qzz
inoremap <F4> <Esc>mqggVG=`qzza
简短说明:
mq place marker 'q' at cursor position
ggVG select all text
= re-indnet text
`q return cursor back to position stored in 'q' marker
zz center the display over the cursor
a return to insert mode if called from it
它基本上可以工作,但有两个缺点。
第一个是它覆盖q标记。我用这个标记来存储光标位置。我选择q因为我不太可能用这封信作为标记。尽管如此,有没有更聪明的方法来实现这一点,而不破坏q标记?
第二个发生在插入模式下,此时光标位于行的开头。在这种情况下,F4会按预期重新缩进,但也会将光标向右移动一位。我尝试使用<C-o>
而不是修复它<Esc>
,但它看起来<C-o>
只适用于编辑器:命令,不移动命令。我该如何修复它?
答案1
您可以使用最后一个跳转标记 ( m'
) 作为临时标记。为了避免使用不同的命令重新进入插入模式(i
vs. a
),您可以使用以下命令gi
,该命令会在上次退出的位置重新进入插入模式:
inoremap <F4> <Esc>m'ggVG=``zzgi
答案2
您可以使用i
代替a
将光标保持在旧位置:
inoremap <F4> <Esc>mqggVG=`qzzi
我认为你不能用q
标记做得更好,从Vim 维基:
要设置标记,请键入 m,后跟一个字母。例如,ma 在当前位置(行和列)设置标记 a。如果设置标记 a,则当前文件中先前标识为 a 的任何标记都将被删除。如果设置标记 A,则任何先前的标记 A(在任何文件中)都将被删除。
您无法在不破坏标记的情况下使用它。
答案3
稍微短一点:
inoremap <F4> <Esc>m'gg=G''zzgi
我们不需要使用视觉模式来进行缩进校正。相反,使用视觉模式进行选择,然后重新缩进 (VG=),我们可以使用带方向的重新缩进 (=G)。