【问题标题】:How can VIM tell the difference between `Ctrl-J` and `LF`?VIM 如何区分 `Ctrl-J` 和 `LF`?
【发布时间】:2013-01-30 23:20:25
【问题描述】:

我正在尝试创建一个小的 Python/curses 应用程序。

但据我所知,无法判断是否 CTRL+JEnter 已被按下。现在这可能是因为它们都具有相同的 ascii 代码 (10):

http://en.wikipedia.org/wiki/Control_character#In_ASCII

但是 VIM 怎么区分这两者呢?

【问题讨论】:

    标签: python vim ncurses python-curses


    【解决方案1】:

    Enter 通常相当于 C-m。但是,如果icrnl 标志对 tty 有效(请参阅stty -a),则输入 C-m 将自动转换为 C-j(因此只需按 Enter 即可轻松键入 Unix-ly 终止行)。

    在纯 C 语言中,您可以使用 termios 函数 tcgetattr(3)tcsetattr(3) 来取消设置 @987654325 中的 ICRNL 标志@ 以便 C-m 在输入时不会转换为 C-j。如果您想对输入和输出进行绝对控制,您将使用“原始”模式(禁用所有输入和输出处理)。看起来像Python has these termios functions

    curses 库有一些处理 tty 模式的高级函数:savetty(3)resetty(3)nonl(3)、raw(3)cbreak(3)等,也像Python has these curses functions

    如果您正在使用 curses 库的其他部分,那么最好也使用它的函数来调整 ICRNL 标志(例如 nonl(3))以避免破坏库所做的任何假设(即它假设 tty 设置为一种方式,但是您的 termios 级别的调用会改变事情并破坏该假设)。

    【讨论】:

    • curses.nonl 完成了这项工作!这正是我想知道的!
    【解决方案2】:

    我不认为<ctrl-J>Enter 相同。在 vim 中,<ctrl-j> 的键码为 10,而Enter 的键码为 13。

    有一些等效的键,例如

    <ctrl-M> and Enter
    <ctrl-H> and backspace
    <ctrl-[> and ESC
    ...
    

    您可以在您的 vim 中进行测试,&lt;ctrl-M&gt;Enter 做同样的事情,无论您处于哪种模式。

    其实还有一个组合键,和&lt;Enter&gt;&lt;Ctrl-M&gt;也很难区分。是&lt;C-Enter&gt; 不知道你想实现什么,你说你想做一些终端开发(ncurses),如果终端连那些键都分辨不出来,你就别管了。我没有ncurses的经验,如果我错了不要生气。 ^_^

    如果你输入:h keycodes你可以看到更多信息,下表是从vim帮助中复制的。

    notation    meaning         equivalent  decimal value(s)    ~
    -----------------------------------------------------------------------
    <Nul>       zero            CTRL-@    0 (stored as 10) *<Nul>*
    <BS>        backspace       CTRL-H    8 *backspace*
    <Tab>       tab         CTRL-I    9 *tab* *Tab*
                                *linefeed*
    <NL>        linefeed        CTRL-J   10 (used for <Nul>)
    <FF>        formfeed        CTRL-L   12 *formfeed*
    <CR>        carriage return     CTRL-M   13 *carriage-return*
    <Return>    same as <CR>                *<Return>*
    <Enter>     same as <CR>                *<Enter>*
    <Esc>       escape          CTRL-[   27 *escape* *<Esc>*
    <Space>     space                32 *space*
    <lt>        less-than       <    60 *<lt>*
    <Bslash>    backslash       \    92 *backslash* *<Bslash>*
    <Bar>       vertical bar        |   124 *<Bar>*
    <Del>       delete              127
    <CSI>       command sequence intro  ALT-Esc 155 *<CSI>*
    <xCSI>      CSI when typed in the GUI       *<xCSI>*
    

    【讨论】:

      【解决方案3】:

      &lt;C-J&gt; 等价于&lt;NL&gt;,而不是&lt;CR&gt;(对应于&lt;C-M&gt;):

      :echo "\<C-J>" ==# "\<CR>"
      0
      :echo "\<C-J>" ==# "\<NL>"
      1
      

      所以你的假设是错误的;甚至 Vim 也无法区分它们。由于键盘输入在内部处理的方式,并且由于终端及其 API 的悠久而复杂的历史,很难区分这些键(在大多数现代终端仿真器中),但今天这是可能的。

      有些人(最重要的是 Paul LeoNerd Evans)想要解决 Vim 中的问题,并提出了各种建议,cp。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

      但截至今天,还没有补丁或志愿者出现,尽管许多人表示希望在未来的 Vim 8 主要版本中提供此功能。我不知道如何在 Python 中解决这个问题,但您可能会从链接的讨论中找到一些见解。

      【讨论】:

        猜你喜欢
        • 2020-03-30
        • 1970-01-01
        • 2011-01-07
        • 2023-03-03
        • 2013-01-29
        • 2010-10-25
        • 2015-07-20
        • 2016-06-26
        • 1970-01-01
        相关资源
        最近更新 更多