【问题标题】:How do I set up vim to automatically change my background color depending on whether CAPS LOCK is on or not?如何设置 vim 以根据 CAPS LOCK 是否打开自动更改背景颜色?
【发布时间】:2010-09-22 07:48:19
【问题描述】:

我是一个狂热的 vim 用户,最近开始编写一些 SQL 代码。我喜欢用 CAPS 编写我的 SQL 语句,有时会忘记将 CapsLock '关闭',然后我很快就在我意识到发生了什么之前对我的代码造成了严重破坏。

到目前为止,除了查看我的键盘(这需要我将视线从屏幕上移开,我认为这是一个很大的延迟)之外,我还没有找到任何方法来判断 CapsLock 键是否打开。

理想情况下,我希望 vim 在 CapsLock 为“打开”时自动更改我的背景颜色,但我愿意满足于 CapsLock的其他屏幕指示器> 妥协的状态。

【问题讨论】:

    标签: keyboard vim


    【解决方案1】:

    建议将小写字母映射到大写字母的人是正确的,但我们需要添加更多细节。诀窍是将 SQL 关键字 映射为大写。然后你可以用小写字母输入它们,vim 会帮你转换成大写字母。这是使用缩写而不是映射来完成的。例如,如果您创建缩写

    :iab ATT American Telephone and Telegraph
    

    那么每次你在代码中输入 'ATT' 时,只要你按下空格键,Vim 就会自动将其翻译成 'American Telephone and Telegraph'。 (试试看!很有趣!)

    因此,创建一个新文件并开始输入所有 SQL 关键字的缩写。

    iab select SELECT
    iab like LIKE
    iab where WHERE
    ...
    

    由于您只希望在编辑 SQL 源代码时应用这些缩写,因此将此文件保存到 ~/.vim/after/ftplugin/sql.vim 当 Vim 检测到它打开了一个文件时,将执行此文件中的命令SQL 文件。

    文件类型检测只有在你打开它时才有效,所以确保你的 .vimrc 有如下行:

    set nocompat
    filet detect plugin on
    

    一旦你完成这项工作,你应该节省时间并且减少一直按住 shift 键的腕管!

    【讨论】:

    • 要创建缩写文件,我会输入所有(小写的)sql关键字,每个关键字都在自己的行中,并使用命令:%s,^\w\+$,iab & \U&
    【解决方案2】:

    你能得到的最接近的是肯特的答案。 Vim 看不到 CapsLock(或 NumLock,或 ScrollLock,或任何其他修饰键),因为这些键的状态未发送一个终端。

    请注意,理论上 gVim 可以看到这些修饰符,但实际上却看不到。 gVim 的键盘处理在许多其他方面都优于 vim。

    【讨论】:

      【解决方案3】:

      我所做的是将我的大写锁定键绑定到“撰写”键,所以我的大写锁定键实际上丢失了,我只是强迫自己使用 SHIFT。 :)

      可能想尝试一下,这听起来可能有点自虐,但从长远来看会更好。有人认为大写锁定是多余的。

      【讨论】:

      • 这是一个选择,但我不想走这条路。我发现 Caps Lock 键确实有帮助,并且更愿意继续使用它。
      • 如果您在 ALL CAPS 中输入大量内容,那么丢弃 CAPS LOCK 会真的减慢您的输入速度。
      • 我看到将所有大写字母捆绑在一起的速度变慢了=p。此外,无论如何,我从来没有用我的小指做任何事情。对于打字风格来说,它可能“不好”,......但从好的方面来说,HOLDING SHIFT 从来没有让我失望。
      【解决方案4】:

      我能给你的最好的方法是让 vim 在 CAPSLOCK 时切换背景颜色 键在 vim 中被击中。

      Vim 不能单独检测 CAPSLOCK 键。我能给你的是一个映射,所以你可以使用其他键(在本例中为 F3)来充当插入模式的 CAPSLOCK 键,并在全大写打开时更改背景颜色。希望这将为您提供所需的功能。

      将以下内容放入您的 ~/.vimrc 或适当的 ~/.vim/ftplugin/.vim 中:

          " let the case be toggled in normal mode
          map <expr> <F3> ToggleInsertCase()
          " let the case be toggled in insert mode
          imap <expr> <F3> ToggleInsertCase()
      
          let toUpper = 0
          func! ToggleInsertCase() 
              let g:toUpper = 1 - g:toUpper
              if (g:toUpper == 1)
                  highlight Normal ctermbg=Blue " the background color you want when uppercased
                  " convert all the letters to uppercase in insert mode
                  let i = char2nr('a')
                  while i <= char2nr('z')
                      let c = nr2char(i)
                      exe 'inoremap' c toupper(c)
                      let i = i + 1
                  endwhile
              else
                  highlight Normal ctermbg=Black " the background color you want normally
                  " let letters be as normal in insert mode
                  let i = char2nr('a')
                  while i <= char2nr('z')
                      let c = nr2char(i)
                      exe 'iunmap' c 
                      let i = i + 1
                  endwhile
              endif
              " don't insert anything when this function is called in normal mode
              return ""
          endfunc
      

      这从Tim Pope's capslock.vim借了一些。

      如果您真的想为此使用 CAPSLOCK 键,根据您的平台,有很多免费应用程序可以让您重新映射 你的 CAPSLOCK 键到别的东西,所以你可以设置它,当你点击 CAPSLOCK 时,vim(和其他所有东西)得到 F3。管他呢。 这会干扰其他应用程序获取 CAPSLOCK 键(除非键重新映射器应用程序很聪明),因此可能会很麻烦。

      【讨论】:

      • 这种方法将是完美的,因为我需要确保当我从另一个窗口进入 vim 时我没有打开 Caps Lock。你能不能再充实一点?我以前没有写过 vimscript 并且玩弄你给出的命令并没有达到我的预期。谢谢。
      【解决方案5】:

      为什么不为包含 imap 命令的 .sql 文件提供文件类型插件,以将所有击键转换为大写字母。这样一来,您就不必在键盘上切换实际的大写锁定键,当您返回代码时一切都会好起来的。

      在 $VIM/vimfiles/ftplugin/sql_too.vim 文件中添加以下内容:

      imap a A
      imap b B
      imap c C
      imap d D
      imap e E
      imap f F
      imap g G
      imap h H
      imap i I
      imap j J
      imap k K
      imap l L
      imap m M
      imap n N
      imap o O
      imap p P
      imap q Q
      imap r R
      imap s S
      imap t T
      imap u U
      imap v V
      imap w W
      imap x X
      imap y Y
      imap z Z
      

      【讨论】:

      • 这是一个想法,但在其他情况下我也喜欢编写大写字母,例如在使用环境变量的 shell 脚本中。此外,在 SQL 代码中,我仍然需要能够以 CamelCase 和混合大小写形式编写表名和列名,我将如何在这里做到这一点?
      【解决方案6】:

      我同意 Kent 的观点,并将 Caps Lock 键重新映射到控制键。我使用 AutoHotKey 在 Windows 机器上执行此操作,但有一个注册表设置,如 here 和许多其他地方所述。如果您不使用 Windows,您还可以轻松地在 MacOS 和 unix X 窗口平台上重新映射 caps lock 键。

      不会意外锁定大写的便利,远远超过我一年中真正想要的几次!

      【讨论】:

        猜你喜欢
        • 2010-11-10
        • 2011-12-27
        • 2013-09-03
        • 1970-01-01
        • 2012-02-07
        • 2021-09-03
        • 1970-01-01
        • 2020-11-06
        • 1970-01-01
        相关资源
        最近更新 更多