В чем разница между j, CTRL-J, <NL> и CTRL-N в обычном режиме?

12

Я видел где-то в Интернете кого-то, кто использовал, Ctrl-Jи, поскольку я не знал этого отображения, я посмотрел в соответствующем документе и обнаружил следующее:

j           or
<Down>      or
CTRL-J      or
<NL>        or
CTRL-N          [count] lines downward linewise.

Что приводит меня к нескольким вопросам:

  • Что<NL> : я бы посчитал это эквивалентом того, что по умолчанию <CR>нажатие Enterв обычном режиме будет идти вниз на одну строку, но почему это <NL>здесь, а нет <CR>?
  • В чем разница между этими сопоставлениями : все ли эти 5 опций одинаково проходят одну строку вниз? Согласно моим тестам, я бы ответил да, но это привело бы к моему следующему вопросу.
  • Почему существует 5 сопоставлений, которые делают одно и то же : я могу это понять jи <down>сохранены для пользователей, которые не используются для сопоставлений vim, но почему существуют другие сопоставления?
  • Когда более интересно использовать одно больше, чем другое : это продолжение предыдущего вопроса: если существует так много возможностей, я предполагаю, что они имеют разные преимущества или их лучше использовать в конкретных случаях использования. Что это за варианты использования?

Я считаю избыточность этих команд еще более странно , когда я смотрю на :h k: есть только три пути идти вверх: k, <UP>и ctrl-p. Таким образом, бонусный вопрос: почему есть 5 способов понижения и только 3, чтобы подняться?

statox
источник
Вы уверены, что они использовали Ctrl-Jпривязку по умолчанию ? Кажется распространенным, по крайней мере, среди тех, кого я знаю, отображать Ctrl-J/K«вниз / вверх до следующей строки с тем же уровнем отступа, что и у начальной строки».
Аарон Дюфур
4
Я хотел бы ответить на вопрос: «Почему есть 5 способов понизиться и только 3, чтобы подняться?» Ну, это потому, что в жизни дела идут на юг намного проще! :)
VanLaser
@VanLaser действительно отличный ответ, они должны рассмотреть возможность добавления этой подсказки в документ! ;-)
statox
@VanLaser Жаль, не правда ли? В таком случае все человечество мгновенно превратится в ничто!
xji
«Оставь надежду, все, кто <CR>здесь»
VanLaser

Ответы:

16

Интересно, что вы упомянули <CR>. <CR>или возврат каретки, технически используемый для обозначения перехода к началу линии . <NL>или перевод строки (также называемый обычно переводом строки LF) использовался для обозначения перехода к следующей строке . Со временем это различие было потеряно в большинстве приложений. 1 Нажатие Enterфактически приводит к возврату каретки, обычно (попробуйте нажать CtrlVEnter- вы должны увидеть ^Mв терминалах Unix). <NL>контрольный код есть CtrlJ.

CtrlNудивило меня. Согласно 2 , это сдвиговый персонаж:man ascii

Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
────────────────────────────────────────────────────────────────────────
016   14    0E    SO  (shift out)             116   78    4E    N

Смещение и смещение из символов, согласно Википедии :

... предоставил способ сдвинуть, следовательно, номенклатуру, цветную ленту, разделенную в продольном направлении обычно красным и черным, вверх и вниз на другой цвет в электромеханической пишущей машинке или телепринтере ...

То, как это закончилось, означало идти вниз , для меня загадка.


Почему есть 5 способов спуститься и только 3 - подняться?

Что ж, у всех трех способов подняться есть свои способы спуститься. ( CtrlPпредположительно является дополнением CtrlN, подразумевая, что сдвиг в / из здесь не имеет значения). Два дополнительных пути вниз ( <NL>или CtrlJ) на самом деле являются двумя представлениями одного и того же пути. <NL>это наследство со времен пишущей машинки - и в те дни, я не думаю, что был ключ, чтобы подняться - только чтобы упасть.

Смотрите также:

1 В некоторых случаях это по-прежнему имеет значение (печать \r(возврат каретки) и \n(перевод строки) с использованием большинства форматированных функций / инструментов печати по-прежнему сохраняют прежнее значение.).

2 Эта таблица составлена ​​таким образом, что алфавит соответствует контрольному коду символа в той же строке.

Мур
источник
3
Я всегда думал, что Ctrl-Nдля следующего , и Ctrl-Pбыл для предыдущего . Это то, что они обозначают в Emacs, в любом случае, в котором они связаны next-lineи previous-line. Кроме того, Ctrl-Pне сдвиг в ; это побег канала передачи данных . Сдвиг в том Ctrl-O.
Литис
@ Литис, я исправлюсь.
Муру
2
@Lithis Честно говоря, единственное, что я знаю об Emacs - это cx ce.
Муру
Исторический и четкий ответ, спасибо Муру! Я должен был подумать о кодировке символов ascii, в которой часто лежит ответ.
statox
@muru Это очень плохо, так как Emacs на самом деле есть что предложить, особенно его режим org, который мне очень помог. Я рекомендую вам ознакомиться с проектом Spacemacs github.com/syl20bnr/spacemacs , в котором основное внимание уделяется эмуляции Vim, поэтому вам не нужно знать какую-либо традиционную команду Emacs для использования. Может быть, это немного изменит ваше восприятие.
xji
8

См :help key-notation.

  1. <NL>означает «перевод строки» и <CR>означает «возврат каретки».

    Это два разных способа разрыва текущей строки. Они исторически связаны с различными управляющими символами ( ctrl-jи ctrl-m) , но, как правило , вставляются с тем же ключом, <CR>. Я согласен, что использование <NL>в этом контексте кажется нелогичным.

  2. Все эти «отображения» (на самом деле они не являются отображениями) ведут себя одинаково.

  3. История, в основном, также кроссплатформенные ограничения.

    На терминале Билла Джоя не было выделенных клавиш управления движением, но на hjklклавишах были наклейки со стрелками. Поскольку модальные редакторы в то время были редкостью, нажатие этих клавиш только вставляло связанный символ во все, что вы делали. Вы должны были нажать <C-h>, <C-j>, <C-k>и <C-l>для перемещения курсора на экране.

    Как вы можете видеть, есть довольно перекрытие между j, <C-j>, <NL>и <Down>. <C-n>Вообще говоря, что означает «следующий» в Vim, легко увидеть, как он смешался со своими товарищами.

  4. Поскольку все они являются синонимами, вы можете использовать тот, который лучше всего подходит для вас.

    <CR>Например, интересный ключ для использования в ваших собственных сопоставлениях.

romainl
источник
Спасибо за освещение! Я полностью согласен с <CR>отображением. Также еще один вопрос: я знаю, что эти «комбинации клавиш» на самом деле не называются отображениями, но я не знаю, как их следует называть?
statox
Это интересный вопрос, я склонен называть их «командами».
Ромен
Может быть , я ошибаюсь , но это не «команда» со ссылкой на экс команды режима , типа :ls, :substitute, newи т.д ...?
statox
xэто тоже "команда".
romainl
На самом деле я только что видел , что Doc вызовы x, dd, cи т.д. «команды». Таким образом , вы должны быть правы, я думаю , что jи ^Jтакже команда.
statox