【问题标题】:How to map Shift-Enter如何映射 Shift-Enter
【发布时间】:2013-05-03 13:19:07
【问题描述】:

我正在尝试自定义 Vim 中 Normal 模式下 Enter 键的行为。 这是我的.vimrc

nmap <CR> o<Esc>
nmap <S-CR> i<CR><Esc>

我试图让 Enter 在按下时仅在当前行之后附加一个换行符。但是,当按下Shift-Enter 组合时,我想在光标处断开当前行。

后者不起作用。每当我按Shift-Enter 时,它只会在光标处附加一行而不会中断它。

【问题讨论】:

  • 备选方案:将 i&lt;CR&gt;&lt;ESC&gt; 映射到 。这为分割和连接线带来了很好的 对偶性。并使用 unimpaired 的 ]&lt;space&gt; 添加空行(由 Peter Rickner 提议)。
  • 我试图做同样的事情 =) 这就是我最终做的事情stackoverflow.com/a/26861286/226255

标签: vim


【解决方案1】:

我设法更正了 Shift+Enter 的终端键码 通过发送 Vim 显然期望的键码。根据您的终端, (添加 Ctrl+Enter 作为奖励!)

iTerm2

对于单个配置文件打开 PreferencesProfilesKeys[+](添加)
对于所有配置文件打开 首选项[+](添加)

  • 键盘快捷键:(按Shift+Enter
  • 动作: 发送转义序列
  • Esc+ [13;2u

    重复 Ctrl+Enter,顺序为:[13;5u

urxvt,附加到您的.Xresources 文件:

URxvt.keysym.S-Return:     \033[13;2u
URxvt.keysym.C-Return:     \033[13;5u

Alacritty,在key_bindings 下,将以下内容添加到您的~/.config/alacritty/alacritty.yml

- { key: Return,   mods: Shift,   chars: "\x1b[13;2u" }
- { key: Return,   mods: Control, chars: "\x1b[13;5u" }

Kitty,在~/.config/kitty/kitty.conf

map shift+enter send_text all \x1b[13;2u
map ctrl+enter send_text all \x1b[13;5u

【讨论】:

  • 这应该是公认的答案! (我只需要为Shift+Enter创建iTerm映射)
  • 这太棒了。 Alacrrity 中的映射总是很混乱。感谢分享!
  • &lt;s-cr&gt; 绑定在 Alacritty 中对我不起作用。 &lt;c-cr&gt; 就像一个魅力,但 &lt;s-cr&gt; 似乎在 vim 中相当于 &lt;c-d&gt;zt,我觉得这很令人困惑!在哪里可以找到有关 vim 期望的转义序列的更多信息?
  • @jchook 这可能是你的 Vim 配置中的一个设置。尝试使用-u NONE 或不配置运行。并验证您使用的是正确的 $TERM 值。
  • 在 tmux 3.2a 上(至少在 macOS 和 FreeBSD 中),您还需要在 ~/.tmux.conf 行中添加 bind -n S-Enter send-keys Escape "[13;2u" 等。否则 tmux 不会将代码传递给 neovim。跨度>
【解决方案2】:

由于键盘输入在内部处理的方式,不幸的是,这在今天的 Vim 终端版本中通常是不可能的(&lt;S-CR&gt; 应该在所有平台上的 GVIM 和 Windows 控制台 Vim 中工作)。这是一个已知的痛点,也是 vim_dev 和 #vim IRC 频道上各种讨论的主题。

有些人(最重要的是 Paul LeoNerd Evans)想要解决这个问题(即使是支持此功能的终端中的控制台 Vim),并提出了各种建议,cp。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

但截至今天,还没有补丁或志愿者出现,尽管许多人表示希望在未来的 Vim 8 主要版本中提供此功能。


关于映射&lt;CR&gt;的注意事项:

如果您在正常模式下映射&lt;CR&gt;,它会干扰在命令行窗口中选择历史项目并在快速修复/位置列表窗口中跳转到光标下的错误! (除非您添加以下内容:)

:autocmd CmdwinEnter * nnoremap <CR> <CR>
:autocmd BufReadPost quickfix nnoremap <CR> <CR>

注意:nmap:

You should use :noremap;它使映射不受重映射和递归的影响。

【讨论】:

  • 感谢:nmap:noremap,了解非常有用。我可能会把它绑定到别的东西上。
  • 嘿,非常感谢!我刚刚意识到为什么我会出现这种奇怪的行为(我设置了nnoremap &lt;cr&gt; : =P)。顺便说一句,你是怎么发现的?
【解决方案3】:

我还想映射 并发现我无法让它在 CLI 模式下工作,直到我使用 Ctrl+V 然后 添加第二个映射作为映射的击键。然而, 映射仍然需要 GVIm 才能按预期工作。这将使您的 .vimrc sn-p 如下所示:

nnoremap <CR> o<Esc>
nnoremap <S-CR> i<CR><Esc> " Needed for GVIm
nnoremap ^[0M i<CR><Esc>   " Needed for CLI VIm (Note: ^[0M was created with Ctrl+V Shift+Enter, don't type it directly)

我在 Ubuntu 12.04 上对此进行了测试。 Vimming 快乐!

【讨论】:

  • 在我的 Git Bash (Windows) 和 Linux Mint 的终端 Vim 上都不起作用。在两个 GVim 上工作过。
【解决方案4】:

无论你怎么努力,你都无法在 CLI Vim 中映射 &lt;S-CR&gt;,因为 Vim 无法区分 &lt;S-CR&gt;&lt;CR&gt;

你必须找到另一个映射或坚持使用 GVim/MacVim。

编辑

一些终端模拟器,如 Mac OS X 上的 iTerm.app 或 Terminal.app,允许您设置快捷方式以将特定字符序列发送到 shell。如果您有这种可能性,可能值得一试,但您很快就会习惯无法移植的特定于平台的 gyzmo,所以……我真的不推荐它。

【讨论】:

  • 使用 iTerm 可能会映射您想要的任何疯狂组合,如果您用完标准转义序列,则可以使用自定义转义序列。并与例如你可以在你的键映射中编译 PuTTY,就像我使用 F10 和 Backspace 所做的那样。
  • 此答案仅提供与两个最受好评的答案相同的大部分信息,并且比两者都旧。
【解决方案5】:

Ingo Karkat 和 romainl 是 100% 正确的。但是你问的很常见,所以我想给你一些选择。

我个人推荐使用 Tim Pope 的Unimpaired plugin。它提供了许多映射,但您要查找的是[&lt;space&gt;]&lt;space&gt;,它们分别在当前行的上方和下方创建空白行。 Unimpaired 还提供了很好的映射,用于在 quickfix 列表、缓冲区列表、选项切换等中移动。请参阅:h unimpaired 了解更多信息。

如果您不想使用未损坏的插件,但喜欢下面的映射,可以将一些快速映射放入您的 ~/.vimrc 文件中:

nnoremap <silent> [<space>  :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space>  :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>

【讨论】:

  • 我冒昧地纠正了“黑线” :-) 哦,对未受损的推荐 +1。事实上,我在 LineJuggler plugin 中有自己的替代方案,因为我不喜欢 Tim 将一堆不相关的功能放在一起,只是按常见的映射前缀分组。
  • 感谢您的更改并提及您的 LineJuggler 插件。我喜欢有很多插件可供选择。干杯!
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多