Как настроить vim для автоматического изменения цвета фона в зависимости от того, включен ли CAPS LOCK или нет?

Я являюсь пользователем avid vim и недавно начал писать код SQL. Мне нравится писать свои SQL-запросы в CAPS и иногда забывать переключать CapsLock "off", и затем я быстро нахожу хаос в своем коде, прежде чем я пойму, что происходит.

Я до сих пор не нашел способа определить, является ли клавиша CapsLock другой, чем просмотр моей клавиатуры (что требует от меня взглянуть в сторону от экрана, который я считаю большой задержкой).

В идеале я бы хотел, чтобы vim автоматически менял свой цвет фона, когда CapsLock есть 'on', но я бы согласился на какой-то другой экранный индикатор статуса CapsLock в качестве компромисса.

Ответ 1

Лучшее, что я могу вам дать, это заставить 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.

Если вы действительно хотите использовать ключ CAPSLOCK для этого, в зависимости от вашей платформы, есть множество бесплатных приложений, которые позволяют вам переназначать ваш ключ CAPSLOCK для чего-то другого, поэтому вы можете настроить его так, чтобы при нажатии CAPSLOCK vim (и все остальное) получил F3. Или что угодно. Это может помешать другим приложениям получить ключ CAPSLOCK, хотя (если приложение key-remapper не умное), так что это может быть неприятно.

Ответ 2

Человек, который предложил сопоставить строчные буквы в верхнем регистре, находится на правильном пути, но нам нужно добавить некоторые подробности. Трюк состоит в том, чтобы сопоставить ключевые слова 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

Как только вы получите эту работу, вы должны сэкономить время и иметь меньше кистевого туннеля от удержания клавиши переключения все время!

Ответ 3

Ближе всего вы можете получить ответ Кента. Vim не может видеть CapsLock (или NumLock, или ScrollLock, или любой другой ключ модификатора сам по себе), поскольку состояние этих ключей не отправляется через терминал.

Заметим, что в теории gVim мог видеть эти модификаторы, но на практике это не так. Обработка клавиатуры gVim превосходит vim, но многими другими способами.

Ответ 4

То, что я сделал, связано с ключом блокировки кеша ключом "Создать", поэтому мой ключ-ключ к блокировке фактически отсутствует, и я просто заставляю себя использовать SHIFT вместо этого.:)

Возможно, вы захотите попробовать, это может показаться мазохистским, но лучше в долгосрочной перспективе. Некоторые утверждают, что блокировка Caps избыточна.

Ответ 5

Почему бы не создать плагин filetype для файлов .sql, содержащих команды imap, чтобы преобразовать все ваши нажатия клавиш в кепки. Таким образом, вам никогда не придется переключаться с фактическим ключом на клавиатуре, и все будет хорошо, когда вы вернетесь к коду.

Добавьте в файл $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

Ответ 6

Я согласен с Kent и перенаправляет ключ Caps Lock на управляющий ключ. Я использовал AutoHotKey для этого в ящиках Windows, но здесь есть параметр реестра, описанный здесь и во многих других местах. Если вы не используете Windows, вы также можете легко переназначить ключ блокировки кепок на платформах MacOS и Unix X.

Удобство не, случайно закрывающее колпачки, далеко перевешивает несколько раз в год, я бы действительно этого хотел!