다음 텍스트가있는 경우 :
foo
bar
시각적으로 선택하여 복사합니다.
텍스트는 이제 명명되지 않은 레지스터에 저장되며 "
그 내용은 다음과 같습니다 (출력 :reg "
) :
"" foo^Jbar^J
이 차트 에 따르면 ^J
, 줄 바꿈에 대한 캐럿 표기법 인 것 같습니다 .
다음과 같이 a
입력 하여 이름이없는 레지스터를 레지스터에 복제하려면 :let @a = @"
다음과 같이 내용을 출력 :reg a
하십시오.
"a foo^Jbar^J
바뀌지 않았습니다.
을 입력하여 검색 레지스터에 복제하면 :let @/ = @"
내용은 다음과 같습니다 (출력 :reg /
).
"/ foo^@bar^@
이전 차트에 따르면 ^@
Null 문자에 대한 캐럿 표기법 인 것 같습니다 .
왜 줄 바꿈이 검색 레지스터 내에서 자동으로 널 문자로 변환 a
됩니까 (레지스터가 아님)?
이름을 지정하지 않은 레지스터를 명령 줄 (또는 이후의 검색 내부 /
)에 :<C-R>"
삽입 하면을 입력하여 다음을 삽입합니다.
:foo^Mbar^M
마지막 차트에 따르면 ^M
, 캐리지 리턴에 대한 캐럿 표기법 인 것 같습니다.
명령 행에서 줄 바꿈이 캐리지 리턴으로 자동 변환되는 이유는 무엇입니까?
편집 :
일반적으로 다음을 입력하여 리터럴 제어 문자를 삽입 할 수 있습니다.
<C-V><C-{character in caret notation}>
예를 들어을 <C-R>
입력하여 리터럴 을 삽입 할 수 있습니다 <C-V><C-R>
.
겉으로 보이는 제어 캐릭터에 대해 할 수 있습니다.
그러나 버퍼를 입력하거나 명령 줄에 리터럴 LF를 삽입 할 수 없다는 것을 알았습니다. 입력하면 : 대신 null 문자를 <C-V><C-J>
삽입 하기 때문 ^@
입니다 ^J
.
같은 이유로 LF가 검색 레지스터 내에서 NUL로 변환됩니까?
편집 2 :
에서는 :h key-notation
, 우리는이를 읽을 수 있습니다 :
<Nul> zero CTRL-@ 0 (stored as 10) <Nul>
<NL> linefeed CTRL-J 10 (used for <Nul>)
stored as 10
첫 번째 줄에 및 일부 used for <Nul>
두 번째 줄에는 LF와 NUL 사이의 중복 어떤 종류의가 있음을 나타낼 수 있습니다, 그들은 같은 일로 해석 될 수있다. 후 이전 명령을 실행하기 때문에 그러나이 같은 일이 될 수 없습니다 :let @/ = @"
내가 입력하면, n
2 개 라인의 다음 항목에 도착하는 일반 모드 foo
와 bar
, 대신에 긍정적 인 일치를 받고, 나는 다음과 같은 오류 메시지가 :
E486: Pattern not found: foo^@bar^@
이 링크 외에도 NUL은 문자열의 끝을 나타내고 LF는 텍스트 파일의 줄 끝을 나타냅니다.
그리고 NUL이 stored as 10
도움 말에 따르면 LF와 동일한 코드라면 Vim은 어떻게 2의 차이를 만들 수 있습니까?
편집 3 :
10
도움말에서 알 수 있듯이 LF와 NUL은 동일한 십진 코드로 코딩됩니다 . 그리고 Vim은 컨텍스트 덕분에 2의 차이를 만듭니다. 10
검색 및 명령 레지스터를 제외하고 10 진수 코드가 버퍼 또는 레지스터에 있는 문자를 만나면이 를 LF로 해석합니다.
그러나 검색 레지스터 ( :reg /
) 에서 검색 컨텍스트에서 Vim end of line in a file
은 문자열이 파일이 아니기 때문에 개념이 의미가없는 문자열 만 검색하기 때문에 NUL로 해석합니다. 여전히 \n
검색 패턴으로 원자 를 사용 하지만 정규식 엔진의 기능 일뿐입니까?). 따라서 10
가장 가까운 개념 ( end of string
≈ end of line
) 이므로 자동으로 NUL로 해석 됩니다 .
같은 방식으로 커맨드 라인 / 커맨드 레지스터 ( :reg :
)에서 코드 10
의 개념을 end of line in a file
이해하지 못 하기 때문에 코드 를 CR로 해석합니다 . 가장 가까운 개념은 end of command
빔의 해석 때문에 10
타격이 있기 때문에하는 CR과 같은 Enter
명령을 실행 / 종료로가는 길이며, CR은 타격과 동일 Enter
할 때를있는 그대로 하나의 삽입 이후 <C-V><Enter>
, ^M
표시됩니다.
10
컨텍스트에 따라 코드가 변경 되는 문자의 해석 일 수 있습니다 .
- 버퍼의 줄 끝 (
^J
) - 검색에서 문자열의 끝 (
^@
) - 명령 행의 명령 끝 (
^M
)
someFunction(arg1, "")
arg 2는 ""
"따옴표 사이에있는 항목으로 말 그대로"빈 "항목입니다. 문자열을 구분할 때 기본 C 구현에 의해"추가 "되었기 때문에 NULL이 나타날 수 있습니다. 당신이 이것을 확인하는 방법-그러나 가능한 원인으로 생각됩니다
\r
및 \n
차이점:substitute
도 참조하십시오 .
NULL
문자가 문자열을 처리하는 기본 C 함수로 인해 발생합니다. C가 링크 한 문자열 을 처리하는 방법에 대한 이 설명은 내부적으로 C가 문자열을로 구분한다는 것을 설명합니다NULL
.NULL
이 목적을 위해 좋은 특성을 갖도록 텍스트에서 거의 발생하지 않습니다. 그 결과 C 프로그램 (vim)이 "빈"문자열을 내부 C 함수에 전달하려고하면