在Vim中缩进整个文件而不离开当前光标位置

10

我已经知道在Vim中使用gg=G可以缩进整个文件。但是这会让我在缩进后返回到文件的开头位置。我该如何缩进整个文件并保持光标在原来的位置?


请参见 https://stackoverflow.com/q/1646850/ - user90726
5个回答

18

请参见:h ''

这将使光标回到您所在行的第一个字符:

gg=G''

这将使您回到起始行起始列:

gg=G``

我假设你想要使用带有反引号的第二个版本。实际上,我通常只使用双撇号版本,因为反引号在我的键盘上很难输入。


1
太棒了。第二个版本就是我想要的。唯一的负面点是当前行将在屏幕末尾。 - Fábio Perez
1
很好。如果你想将行重新定位到屏幕中间,请尝试添加“zz”:gg=G``zz - Herbert Sitz
5
保持屏幕不变的代码是:mqHmwgg=G\wzt`q。注意,它使用了 qw` 标记。 - Fábio Perez
@FábioPerez “唯一的负面点是当前行将在屏幕末尾。” - 这似乎是 Vim 9 中的中间行。来自2022年的问候,哈哈。 - user90726
顺便问一下,使用两个反引号的优点是什么,而不是使用<C-O><C-O> - user90726

3

将以下内容添加到你的 .vimrc 文件中

function! Preserve(command)
  " Preparation: save last search, and cursor position.
  let _s=@/
  let l = line(".")
  let c = col(".")
  " Do the business:
  execute a:command
  " Clean up: restore previous search history, and cursor position
  let @/=_s
  call cursor(l, c)
endfunction
nmap <leader>> :call Preserve("normal gg>G")<CR>

您可以将此应用到任何其他命令中,只需将参数更改为“preserve”函数。灵感来自于这里:http://vimcasts.org/episodes/tidying-whitespace/

3
将开头的所有 let 替换为 let w = winsaveview(),将结尾的 letcall 替换为 call winrestview(w),这样你甚至可以还原滚动位置。 - dash-tom-bang

1

与Alex的回答类似,我在vimrc中使用以下映射。

nnoremap g= :let b:PlugView=winsaveview()<CR>gg=G:call winrestview(b:PlugView) <CR>:echo "文件已缩进"<CR>

在正常模式下按下g=,整个缓冲区都会被缩进,并保留滚动/光标位置。


1

您可以使用m命令加上一个字母来为当前位置设置书签。然后在运行缩进命令后,您可以使用`(反引号)命令加上相同的字母返回到该书签处。


1

Herbert 的解决方案基础上,读者还可以在 vim 脚本中使用 <C-o>

exe "norm! gg=G\<C-o>"

或者映射

:nnoremap <F10> gg=G\<C-o>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接