11

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

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

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

4

6 回答 6

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 键的腕管!

于 2009-06-17T08:00:25.330 回答
4

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

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

于 2008-11-14T13:08:37.377 回答
3

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

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

于 2008-11-14T10:28:26.640 回答
1

我能给你的最好的方法是让 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

这从Tim Pope 的 capslock.vim中借用了一些。

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

于 2008-11-14T12:38:58.717 回答
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
于 2008-11-14T13:32:35.550 回答
0

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

意外地锁定大写的便利性远远超过了我一年中真正想要的几次!

于 2008-12-05T00:06:43.500 回答