在正常模式下,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:只有3个办法上去:k<UP>ctrl-p。因此,奖金问题是:为什么会有5种下降的方式而只有3种上升的方式?


您确定他们使用的是默认Ctrl-J绑定吗?至少在我所知的范围内,映射Ctrl-J/K到“向下/向上直到下一行与起始行具有相同缩进级别” 似乎很常见。
亚伦·杜福

4
我想回答“为什么有5种下降方式而只有3种上升方式?” 好吧-这是因为,在生活中,事情往南走就容易了!:)
VanLaser

@VanLaser确实是一个很好的答案,他们应该考虑在文档中添加此提示!;-)
statox

@VanLaser太可惜了。以这种速度,全人类将立即沦为虚无!
xji

“放弃希望,<CR>在这里的所有人”
VanLaser

Answers:


16

你提到的有趣<CR><CR>或回车,从技术上讲是指转到行首<NL>或换行符,也就是换行符(通常称为LF),用于表示转到下一行。随着时间的流逝,在大多数应用程序中这种区别消失了。1Enter实际上,通常按回车键(尝试按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
Lithis

@Lithis我已纠正。
muru

2
@Lithis老实说,我对Emacs唯一了解的是cx ce。
muru

历史明确的答案,非常感谢Muru!我应该想到答案通常位于其中的字符的ASCII码。
statox

@muru太糟糕了,因为Emacs实际上提供了很多东西,尤其是它的组织模式对我有很大帮助。我建议您检查一下项目Spacemacs github.com/syl20bnr/spacemacs,该项目主要侧重于Vim仿真,因此您不需要知道任何传统的Emacs命令即可使用。也许那会改变您的看法。
xji

8

请参阅:help key-notation

  1. <NL>表示“换行”,<CR>表示“回车”。

    这是打破当前界限的两种不同方法。从历史上讲,它们绑定到不同的控制字符(ctrl-jctrl-m),但是通常使用相同的键插入<CR>。我同意<NL>在这种情况下使用似乎违反直觉。

  2. 所有这些“映射”(它们实际上不是映射)的行为完全相同。

  3. 历史大多也是跨平台的约束。

    没有专用的运动键Bill Joy的终端,但是箭头贴花在hjkl键上。由于模态编辑器在当时很少见,因此按下这些键只会将相关角色插入您正在执行的操作中。你必须按<C-h><C-j><C-k><C-l>移动光标在屏幕上。

    正如你可以看到,有相当之间的重叠j<C-j><NL><Down><C-n>通常在Vim中意为“下一个”,因此很容易看出它是如何与同志们融合在一起的。

  4. 由于它们都是同义词,因此您可以自由使用最适合您的一种。

    <CR>例如,是用于您自己的映射的有趣键。


感谢您的启发!我非常同意这种<CR>映射。还有一个问题:我知道那些“键组合”实际上不是映射,但是我不确定应该如何称呼它们?
statox

这是一个有趣的问题,我倾向于称它们为“命令”。
romainl

我可能是错的,但不是“命令”指的是前模式命令一样:ls:substitutenew,等...?
statox

x也是“命令”。
romainl

事实上,我刚才看到的文档调用xddc,等“命令”。所以您一定是正确的,我想那j还是^J命令。
statox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.