Якщо у мене є такий текст:
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 всередину буфера або в командному рядку, тому що якщо я набираю: <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
в звичайному режимі, щоб перейти до наступного появи двох рядків, foo
і bar
замість отримання позитивної відповідності, у мене з'являється таке повідомлення про помилку:
E486: Pattern not found: foo^@bar^@
Крім цього, посилання, схоже, пояснює, що NUL позначає кінець рядка, тоді як LF позначає кінець рядка в текстовому файлі.
І якщо NUL, stored as 10
як говорить довідка, це той самий код, що і для LF, як Vim здатний зробити різницю між двома?
Редагувати 3 :
Можливо, LF та NUL кодуються одним і тим же десятковим кодом 10
, як йдеться в довідці. І Vim робить різницю між двома завдяки контексту. Якщо він зустрічає символ, десятковий код якого 10
знаходиться в буфері або будь-якому регістрі, крім регістрів пошуку та команд, він інтерпретує його як LF.
Але в реєстрі пошуку ( :reg /
) він трактує це як NUL, оскільки в контексті пошуку Vim шукає лише рядок, де поняття end of line in a file
не має сенсу, оскільки рядок не є файлом (що дивно, оскільки ви можете як і раніше використовувати атом \n
у шуканому шаблоні, але, можливо, це лише особливість двигуна регулярних виразів?). Тож воно автоматично трактується 10
як NUL, оскільки це найближче поняття ( end of string
≈ end of line
).
Таким же чином, у командному рядку / регістрі команд ( :reg :
) він інтерпретує код 10
як CR, оскільки поняття end of line in a file
тут не має сенсу. Найближча концепція end of command
так Vim тлумачить 10
як CR, так як ударяти Enter
шлях до кінця / виконати команду і CR такий же , як удари Enter
, так як при вставці буквального з <C-V><Enter>
, ^M
відображаються.
Можливо тлумачення символу, код якого 10
змінюється відповідно до контексту:
- кінець рядка в буфері (
^J
) - кінець рядка в пошуку (
^@
) - закінчення команди в командному рядку (
^M
)
someFunction(arg1, "")
де arg 2 був, ""
тобто "пункт між цитатами, який буквально нічого -" порожній ". NULL може з'явитися, тому що його" додали "базовою реалізацією C, оскільки вона розмежувала рядок. Я не знаю як би ви це перевірили - але це
\r
та \n
відмінності в:substitute
.
NULL
символів викликається базовою функцією C, яка обробляє рядки. Це пояснення того, як C обробляє рядки, з якими ви пов’язані, пояснює, що внутрішньо C розмежовує рядки з aNULL
.NULL
s зустрічаються досить рідко в тексті, що робить його хорошим персонажем для цієї мети. Наслідком цього є те, що якщо програма C (vim) намагалася передати "порожню" рядок у внутрішню функцію C