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

Keyboard 如何设置vim以根据CAPS LOCK是否打开自动更改背景颜色?,keyboard,vim,Keyboard,Vim,我是一个狂热的vim用户,最近开始编写一些SQL代码。我喜欢用CAPS编写SQL语句,有时会忘记关闭CapsLock,然后在意识到发生了什么之前,我很快对代码进行了破坏 我至今还没有找到任何方法来判断锁钥匙是否在看我的键盘(这要求我远离我认为大延迟的屏幕)。 理想情况下,每当CapsLock处于“开启”状态时,我希望vim自动更改我的背景颜色,但作为折衷方案,我愿意接受CapsLock状态的其他屏幕指示器。我所做的是将caps lock键绑定到“撰写”键,因此,我的capslock钥匙实际上丢失

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

我至今还没有找到任何方法来判断锁钥匙是否在看我的键盘(这要求我远离我认为大延迟的屏幕)。
理想情况下,每当CapsLock处于“开启”状态时,我希望vim自动更改我的背景颜色,但作为折衷方案,我愿意接受CapsLock状态的其他屏幕指示器。

我所做的是将caps lock键绑定到“撰写”键,因此,我的capslock钥匙实际上丢失了,我只是强迫自己使用SHIFT键

你可能想尝试一下,这听起来可能有受虐倾向,但从长远来看会更好。一些人认为,上限锁定是多余的

我能给你的最好办法就是让vim在CAPSLOCK启动时切换背景色 键在vim中被击中

Vim无法单独检测CAPSLOCK钥匙。我能给你的是一个映射,这样你就可以使用其他一些键(在这个例子中,F3)来充当插入模式的CAPSLOCK键,并在所有caps都打开时更改背景色。希望这将为您提供所需的功能

将以下内容放入~/.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
“让机箱在正常模式下切换
映射切换insertcase()
“让案例在插入模式下切换
imap ToggleInsertCase()
设toUpper=0
func!ToggleInsertCase()
设g:toUpper=1-g:toUpper
如果(g:toUpper==1)
突出显示普通字符mbg=Blue“大写时所需的背景色
“在插入模式下将所有字母转换为大写
设i=char2nr('a')

而我你能得到的最接近的答案是肯特的答案。Vim无法单独看到CapsLock(或NumLock、ScrollLock或任何其他修改键),因为这些键的状态没有通过终端发送


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

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

在文件$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

我同意Kent的意见,并将Caps Lock键重新映射到control键。我在Windows设备上使用AutoHotKey来实现这一点,但是有一个注册表设置,如前所述,还有许多其他地方。如果您不使用Windows,还可以在MacOS和unix X窗口平台上轻松地重新映射caps lock键


意外锁上盖子的便利性远远超过了我一年中想要的几次

建议将小写字母映射为大写字母的人是正确的,但我们需要添加更多细节。诀窍是将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键的所有时间

这是一个选择,但我不想走这条路。我发现Caps Lock键确实有帮助,而且我更愿意继续使用它。如果你在所有大写字母中键入大量内容,那么扔掉Caps Lock将真正降低你的键入速度。我发现在所有大写字母中绑定内容会降低速度,这是一个额外的好处=p。除此之外,我从来不会用我的小指来做任何事情,实际上,无论如何。这可能是“坏”的打字风格。。。但另一方面,按住SHIFT键从未让我慢下来。这是一个想法,但也有其他场合我喜欢编写CAP,比如在使用环境变量的shell脚本中。此外,在SQL代码中,我仍然需要能够以CamelCase和mixed case格式编写表名和列名,在这里我将如何编写?这种方法将是完美的,因为我需要确保的是,当我从另一个窗口输入vim时,没有大写锁定。你能把这件事再充实一点吗?我以前没有写过vimscript,使用您给出的命令并没有达到我预期的效果。谢谢。要创建缩写文件,我需要输入所有(小写)sql关键字,每个关键字都在自己的行上,并使用命令
:%s,^\w\+$,iab&\U&