Vim 中重新缩进源代码的键盘映射

Vim 中重新缩进源代码的键盘映射

我的按键映射〜/.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') 作为临时标记。为了避免使用不同的命令重新进入插入模式(ivs. 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)。

相关内容