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


我是一个狂热的vim用户,最近开始编写一些SQL代码。我喜欢在CAPS中编写我的SQL语句,有时忘记切换 大写锁定 'off'然后我很快就会对我的代码造成严重破坏,然后才意识到发生了什么。

我到目前为止还没有找到任何方法来判断是否 大写锁定 关键不仅仅是看我的键盘(这要求我远离屏幕,我认为这是一个很大的延迟)。

理想情况下,我希望vim自动更改我的背景颜色 大写锁定 是'开'但我愿意接受一些其他的屏幕指示 大写锁定 作为妥协的地位。


3628
2017-11-14 09:58


起源



答案:


我能给你的最好的是每当CAPSLOCK时让vim切换背景颜色 密钥在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

这借了一些 蒂姆波普的capslock.vim

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


1
2018-06-17 08:00



这种方法是完美的,因为我需要确保的是当我从另一个窗口进入vim时我没有Caps Lock。你或许可以更多地充实这个吗?我之前没有写过vimscript,并且玩过你给出的命令并没有给出我期望的结果。谢谢。 - snth


答案:


我能给你的最好的是每当CAPSLOCK时让vim切换背景颜色 密钥在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

这借了一些 蒂姆波普的capslock.vim

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


1
2018-06-17 08:00



这种方法是完美的,因为我需要确保的是当我从另一个窗口进入vim时我没有Caps Lock。你或许可以更多地充实这个吗?我之前没有写过vimscript,并且玩过你给出的命令并没有给出我期望的结果。谢谢。 - snth


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

:iab ATT American Telephone and Telegraph

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

因此,创建一个新文件并开始输入所有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

一旦你开始工作,你应该节省时间  从按住换档键一直有较少的腕管!


5
2017-11-14 13:08



要创建缩写文件,我将输入所有(小写)sql关键字,每个关键字都在自己的行上,并使用命令 :%s,^\w\+$,iab & \U& - Tobias


你能得到的最接近的是Kent的答案。 Vim看不到 大写锁定 (要么 数字键盘(的第一个键, 要么 ScrollLock键,或任何其他修改键本身)因为这些键的状态不是通过终端发送的。

请注意,理论上,gVim可以看到这些修饰符,但实际上并非如此。 gVim的键盘处理在很多其他方面优于vim。


4
2017-11-14 10:28





我所做的是将我的大写锁定键绑定到“Compose”键,因此我的大写锁定密钥实际上已丢失,我只是强迫自己使用SHIFT。 :)

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


3
2017-11-14 13:32



这是一个选择,但我不想走这条路。我发现Caps Lock键确实有用,并且希望继续使用它。 - snth
如果你在所有大写字母中输入很多东西,那么扔掉CAPS LOCK就会 真 降低你的打字速度。 - iconoclast
我认为所有大写的东西都会减慢作为奖励= p。此外,我从来没有使用我的小指除了转移之外的其他任何东西。它可能是“坏”的打字风格,...但在加号,持有转移从来没有让我放松。 - Kent Fredric


为什么不为包含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

0
2017-12-05 00:06



这是一个想法,但也有其他情况我喜欢写帽子,比如在使用环境变量的shell脚本中。另外,在SQL代码中,我仍然需要能够在CamelCase和混合大小写中编写表名和列名,我将如何在此处执行此操作? - snth


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

方便的  不小心盖上帽子,远远超过我一年想要的几次!


0