Якщо у мене є такий текст:
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.NULLs зустрічаються досить рідко в тексті, що робить його хорошим персонажем для цієї мети. Наслідком цього є те, що якщо програма C (vim) намагалася передати "порожню" рядок у внутрішню функцію C