如何设置vim,根据CAPS LOCK键的开关自动更改背景颜色?

12

我是一名热爱使用vim的用户,并最近开始编写一些SQL代码。我喜欢用大写字母写我的SQL语句,有时会忘记切换键,然后很快就在我的代码中造成了混乱,才意识到发生了什么。

至今我还没有找到任何告诉我键是否打开的方法,除了看我的键盘(这需要我从屏幕上看开销很大)。

理想情况下,我希望vim可以在键“开启”时自动更改我的背景颜色,但我愿意接受其他一些屏幕指示器来表示状态作为妥协。

6个回答

5
最接近的答案是 Kent 的回答。Vim 无法看到 CapsLock(或 NumLock、ScrollLock 或任何其他修饰键本身) ,因为这些键的状态不会通过终端发送。
请注意,理论上 gVim 可以看到这些修改器,但实际上它并不会。gVim 的键盘处理在许多其他方面都比 vim 更好。

5

建议将小写字母映射为大写字母的人是正确的,但我们需要添加更多细节。诀窍是将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键而导致的腕隧道症候群!


1
要创建缩写文件,我会输入所有(小写)SQL关键字,每个关键字占一行,并使用命令 :%s,^\w\+$,iab & \U& - Tobias

3
我所做的是将我的大写锁定键绑定到“Compose”键,因此我的大写锁定键实际上已经不存在了,我只能强迫自己使用SHIFT键。 :)
可能想尝试一下,这听起来可能有点虐待狂,但从长远来看更好。有人认为大写锁定键是多余的。

那是一个选项,但我更倾向于不选择这条路。我发现大写锁定键确实有帮助,而且我更喜欢继续使用它。 - snth
如果你总是打大写字母,那么关闭大写锁定键会真正降低你的打字速度。 - iconoclast
我发现将所有东西都用大写字母打出来会减慢速度,这反而成为了一个优点 =p。此外,除了按Shift键之外,我从不使用小指。这可能对打字风格来说是“不好的”...但是好处是,按住Shift键从未减慢我的速度。 - Kent Fredric

2

我能为你提供的最好建议是当在vim中按下CAPSLOCK键时,让vim切换背景颜色。

Vim无法单独检测到CAPSLOCK键。我可以给你一个映射,这样你就可以使用其他键(在本例中为F3)来代替插入模式下的CAPSLOCK键,并在所有大写字母开启时更改背景颜色。希望这能给你所需的功能。

将以下内容放在您的~/.vimrc文件或适当的~/.vim/ftplugin/<filetype>.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的capslock.vim

如果你真的想要使用大写锁定键来实现此功能,根据你的平台,有许多免费应用程序可以让你重新映射大写锁定键到其他按键上,所以你可以将它设置为当你按下大写锁定键时,vim(和其他所有应用程序)都能得到F3。或者其他按键。不过这样会干扰其他应用程序获取大写锁定键(除非键盘映射应用程序很聪明),所以可能会有麻烦。


这种方法非常完美,因为我所需要确保的就是在从另一个窗口进入vim时不要开启大写锁定。你能否再详细解释一下?我之前没有写过vimscript,尝试使用你给出的命令并没有得到我期望的结果。谢谢。 - snth

0

我同意Kent的观点,将Caps Lock键重新映射为Control键。我在Windows系统上使用AutoHotKey来完成这个操作,但也有一个注册表设置,如此处和其他许多地方所述。如果您没有使用Windows,则还可以轻松地在MacOS和Unix X窗口平台上重新映射大写锁定键。

意外地开启大写锁定键的便利性远远超过了我每年实际需要它的几次!


0
为什么不为包含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和混合大小写编写表名和列名,那么我该怎么做呢? - snth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接