2015-12-24 8 views
8

で異なる状況下で、\ rをの異なった行動はのは、異なる状況下で\nの効果を見る手放す、​​私は文字「S」とのラインを持っていると言う: nと、Vimの

: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はまだ「改行」として解釈されますが、どのようにバックスラッシュを説明するために?

次の部分、私はまだだけではなく、\nの文字「S」、\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の効果が:echo "a\nb"\nのようなもので、バックスラッシュのルールは同じです。

: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は何をしますか?そして3番目のサブケースはさらに見知らぬ人です。

: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下異なり直接echosubstitute()に動作しますか?
  2. substitute()を使用した場合のバックスラッシュの効果の違いを説明するにはどうすればよいですか?
  3. Vimで\n\rの違いは何ですか?

補足1:

I :let s = "a\\\nb"、その後<C-r>=sはバッファにそれを見るためにならば、私はこれを説明するためにどのように

a\ 
     b 

を参照してください? :echosubstitute()両方について

答えて

2
  1. \nは改行であり、\rは、キャリッジリターンです。彼らはあなたが期待することを行うべきです。 \nはカーソルを次の行(列1)に移動し、\rはカーソルを同じ行の列1に移動します。 \rの場合、印刷される次の文字は以前に印刷された文字を上書きします。 (ほとんど私はsubstitute():echoに集中している、:substituteは以下です)

  2. なぜ、echoとsubstitute()が異なって振る舞うのですか?あなたは、文字列の解釈がどれだけ起こっているかを理解する必要があります。 echoの場合は、substitute()が2回起きたときに1つしか発生しません。

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

二つ目は、あなたがエコーを期待したものと同じです。 二重引用符で囲まれた文字列には、:help expr-quoteに従って内容が変更されています。これは、両方のエコーと文字列は一度だけ解釈されている場合、代替は

"a\\\rb"(単一引用符を使用している)同じものを見ることを意味秒後に1つの解釈し、その後a<CR>ba\rbとして解釈されます。それではbしか印刷されません。

  1. \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). 
... 
+0

恐ろしい答え!私はほとんどそれを得る。 '' a \\ rb ''は解釈の1つ後に' a \ rb'と解釈​​されるのはなぜですか?:echo substitute( ""、 ""、 "a \\\ rb"、 "")この解釈は 'substitute()'のためですか?一つの解釈の後に 'a \^Mb'でなければならないのでしょうか? – fujianjin6471

+0

@ fujianjin6471です。しかし '\^M 'の意味はほとんど定義されていません。 ':h/\\ '以下の特殊文字を意味するバックスラッシュは、将来の拡張のために予約されています。現在 '\^M'は改行として解釈されます。 '^ M 'をバッファに入れたら(' ')、'/\^M'を検索すると分かります。そして '^ M'がマッチすることを見てください。 (この動作には依存しないでください) – FDinoff

+0

ありがとうございますが、私が ':\ s \" a \\\ nb "'とそれに ' = s'をバッファに入れて見れば、何か本当に説明できないものが見えます。私はその質問にそれを示します。 – fujianjin6471