gpt4 book ai didi

vim - Vim 中不同情况下\n 和\r 的不同行为

转载 作者:行者123 更新时间:2023-12-03 03:28:13 24 4
gpt4 key购买 nike

假设我有一行只有一个字符“s”,让我们看看 \n不同情况下的效果:

:s/s/a\nb
a^@b
:s/s/a\\nb
a\nb
:s/s/a\\\nb
a\^@b
:s/s/a\\\\nb
a\\nb

:echo "a\nb"
a
b
:echo "a\\nb"
a\nb
:echo "a\\\nb"
a\
b
:echo "a\\\\nb"
a\\nb

那么为什么 \n 会这样呢?表现不同?然后让我们使用 substitute() 查看条件

:echo substitute(" ", " ", "a\nb", "")
a
b
:echo substitute(" ", " ", "a\\nb", "")
a
b
:echo substitute(" ", " ", "a\\\nb", "")
a
b
:echo substitute(" ", " ", "a\\\\nb", "")
a\nb

这一次,\n仍然被解释为“换行”,但是如何解释反斜杠?

下一部分,假设我仍然有一行只有一个字符 's',而不是 \n , \r将要研究的是:

:s/s/a\rb
a
b
:s/s/a\\rb
a\rb
:s/s/a\\\rb
a\
b
:s/s/a\\\\rb
a\\rb

\r的效果就像\n:echo "a\nb" ,反斜杠的规则相同。

:echo "a\rb"
b
:echo "a\\rb"
a\rb
:echo "a\\\rb"
b\ "This is the most strange case!!!
:echo "a\\\\rb"
a\\rb

\r 是什么意思?在这种情况下怎么办?第三个子案例更奇怪。

:echo substitute(" ", " ", "a\rb", "")
b
:echo substitute(" ", " ", "a\\rb", "")
b
:echo substitute(" ", " ", "a\\\rb", "")
b
:echo substitute(" ", " ", "a\\\\rb", "")
a\rb

不过,我无法理解不同数量的反斜杠的行为方式。

我的问题是:

  1. 为什么\n\r :substitute 下的行为有所不同、 echo直接和substitute()
  2. 如何解释使用substitute()时不同数量的反斜杠的效果?
  3. \n 之间有什么区别和\r在 Vim 中?

补充1:

如果我:let s = "a\\\nb"然后<C-r>=s在缓冲区中看到它,我明白

a\
b

如何解释这个?

最佳答案

  1. 对于两者:echosubstitute() , \n是换行符并且 \r是一个回车符。他们应该做你所期望的事情。 \n将光标移动到下一行(第 1 列),然后 \r将光标移至第 1 列同一行。对于 \r打印的下一个字符将覆盖先前打印的字符。 (我主要关注 substitute():echo:substitute 在下面)

  2. 为什么 echo 和 Replace() 的行为不同。您需要了解该字符串发生了多少种解释。对于 echo 只发生一种情况,对于 replacement() 则发生两种情况。

    :echo substitute(" ", " ", "a\\\rb", "")
    b
    :echo substitute(" ", " ", 'a\\\rb', "")
    b\

第二个与您对 echo 的期望相同。双引号中的字符串的内容根据 :help expr-quote 进行了更改。这意味着如果字符串仅被解释一次(使用单引号),则 echo 和替换会看到相同的内容

"a\\\rb"被解释为 a\rb经过一种解释,然后 a<CR>b第二次之后。这导致只有 b正在打印。

  • \r\n根据使用地点的不同而变化。唯一的区别是 :substitute哪里\r在替换中用作换行符。
  • <小时/>

    这是 :substitute 的情况之一和substitute()表现不同,

    :substitue如下

      <CR>        split line in two at this point
    (Type the <CR> as CTRL-V <Enter>) s<CR>
    \r idem s/\r
    ...
    \n insert a <NL> (<NUL> in the file)
    (does NOT break the line) s/\n

    ( <NUL>^@ 相同,但与换行符不同)

    同时substitute()如下

    The special meaning is also used inside the third argument {sub} of
    the substitute() function with the following exceptions:
    ...
    - <CR> and \r inserts a carriage-return (CTRL-M).
    ...

    关于vim - Vim 中不同情况下\n 和\r 的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34454270/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com