几乎每个 vim 用户都想优雅地解决这个问题,而我发现我们还需要一个解决方案来摆脱 ^M 并立即保持光标位置。
我个人使用一个函数来保存我的光标位置,因为当我们摆脱 ^M 时,光标位置会改变:
" preserve function
if !exists('*Preserve')
function! Preserve(command)
try
let l:win_view = winsaveview()
"silent! keepjumps keeppatterns execute a:command
silent! execute 'keeppatterns keepjumps ' . a:command
finally
call winrestview(l:win_view)
endtry
endfunction
endif
去掉^M的propper函数
" dos2unix ^M
if !exists('*Dos2unixFunction')
fun! Dos2unixFunction() abort
"call Preserve('%s/ $//ge')
call Preserve(":%s/\x0D$//e")
set ff=unix
set bomb
set encoding=utf-8
set fileencoding=utf-8
endfun
endif
com! Dos2Unix :call Dos2unixFunction()
如您所见,我们使用\x0D$ 而不是^M,它是^M 的十六进制代码
set bomb 选项有助于将文件视为 UTF-8 help here。它有助于解决编码问题。
“保留”功能还可以用于许多其他事情,例如在不“移动”光标的情况下重新缩进整个文件
command! -nargs=0 Reindent :call Preserve('exec "normal! gg=G"')
上面的行将设置一个不带参数“-nargs=0”的“Reindent”命令。顺便说一下我的一些 init.vim here
注意:值得一提的是上面两个函数前面的“ifs”,它被称为守卫,它可以帮助我们避免在内存中两次加载函数,从而尽可能地让我们的 vim/neovim 负责。