如何设置vim以根据CAPS LOCK是否打开自动更改背景颜色?

snt*_*nth 11 keyboard vim

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

到目前为止,我还没有找到任何方法来判断CapsLock键是否只是在看我的键盘(这需要我远离屏幕,我认为这是一个很大的延迟).

理想情况下,我希望vim在CapsLock"开启" 时自动更改我的背景颜色,但我愿意接受其他一些屏幕上的CapsLock状态指示作为妥协.

Zat*_*rus 5

您能得到的最接近的是肯特的答案。Vim 无法看到CapsLock(或NumLock、 或ScrollLock,或任何其他修饰键本身),因为这些键的状态不是通过终端发送的。

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


Ste*_*e K 5

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

:iab ATT American Telephone and Telegraph
Run Code Online (Sandbox Code Playgroud)

然后,每当您在代码中键入"ATT"时,只要您点击空格键,Vim就会自动将其翻译为"美国电话和电报".(试试吧!很有趣!)

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

iab select SELECT
iab like LIKE
iab where WHERE
...
Run Code Online (Sandbox Code Playgroud)

由于您只想在编辑SQL源时应用这些缩写,因此请将此文件保存到〜/ .vim/after/ftplugin/sql.vim当Vim检测到已打开SQL文件时,将执行此文件中的命令.

文件类型检测仅在您打开时才有效,因此请确保您的.vimrc包含以下行:

set nocompat
filet detect plugin on
Run Code Online (Sandbox Code Playgroud)

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


ram*_*ion 2

我能给你的最好的办法就是让 vim 在 vi​​m 中按下 CAPSLOCK 键时切换背景颜色。

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
Run Code Online (Sandbox Code Playgroud)

这借鉴了Tim Pope 的 capslock.vim的一些内容。

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