【问题标题】:Map :%s/^M//g in vimrc映射 :%s/^M//g in vimrc
【发布时间】:2020-12-13 14:58:50
【问题描述】:

我正在尝试在我的 vimrc 中映射一个命令,以删除我有时在文件中看到的回车符 ^M。 :%s/^M//g (^M from ctrl-v, ctrl-m) 当我在文件中时很容易工作,但是当我将它保存在我的 vimrc 中时,它就不好了。

nmap ,dm  :%s/^M//g <cr>

我猜这是因为 ^M 在通过 vimrc 映射时的解释不同,所以我尝试用 \ 转义它,但无济于事。如何映射此命令以删除回车符?

FWIW,我在 Windows 上使用 gVim。

【问题讨论】:

  • 使用\r(回车,这就是字符的调用方式)而不是^M

标签: vim


【解决方案1】:

几乎每个 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 负责。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2019-07-22
    相关资源
    最近更新 更多