Estou na posição um pouco incomum de usar dois layouts de teclado diferentes regularmente ( programadores-Dvorak e turco-F ). Esses layouts são bem diferentes um do outro e eu só posso ser proficiente no vim com um conjunto de memórias musculares. Sou bastante competente com os comandos vim no layout Dvorak, mas é quase impossível usá-lo se meu teclado estiver no layout turco-F. Infelizmente, edito regularmente arquivos em inglês e turco e até mesmo idiomas mistos. Minha proficiência é tal que eu posso digitar qualquer idioma em seu respectivo layout de teclado, mas meu cérebro se recusa a conectá-los e digitar algumas letras de uma palavra em turco no layout de Dvorak ou vice-versa.
Eu tenho ligações com duas teclas de saudação para alterar o layout no Xorg, mas mesmo isso me deixa com um fluxo de trabalho estranho no vim ao editar arquivos de idioma misto:
<vim commands…>i<switch to tr>…content…<escape><switch to en><vim commands…>
Gostaria de poder encurtar isso para algo como:
<vim commands…><leader>i…content…<escape><vim commands…>
... de modo que o uso <leader>i
define vários :imap
valores para emular o layout turco sem alterar o layout do teclado do sistema. Ao mesmo tempo, i
passaria para o modo de inserção, mas sem os :imap
valores extras . Os valores em si são fáceis, eu só preciso dos mapeamentos do alfabeto como estes:
:imap a u
:imap A U
:imap o i
:imap O İ
"etc.
A questão é, como de configuração dois modos de inserção, um modo de inserção normal e um modo de pseudo inserto que é idêntica, excepto por um grupo de mapeamentos, e como pode desencadear estes modos com <leader>i
, <leader>a
etc.?
InsertEnter
eInsertLeave
, que podem ser usados para alternar os layouts automaticamente. Especificamente,InsertLeave
você pode verificar se é turco, se for, alterne para Dvorak, defina um sinalizador e, quando inserir novamente, volte para turco, se esse foi o caso da última vez que saiu do modo de inserção.:imap
é que ele funcionaria mesmo em uma sessão ssh remota ou quando$DISPLAY
não estiver definido.Respostas:
O Vim tem algo parecido com isso na forma de mapas de teclas . De
:help mbyte-keymap
:Somente no modo de inserção Caps Lock descreve esse mapeamento para emulação do Caps Lock; como você pode ver lá, o arquivo de mapeamentos é semelhante ao descrito na sua pergunta.
Você ativa essa configuração via
:set iminsert=1
ou dinamicamente viai_CTRL-^
. Também funciona/search
com a'imsearch'
opçãofonte
A resposta de Ingo Karkat parece que era exatamente a solução certa e resolveu minha situação. No entanto, aqui estão instruções um pouco mais detalhadas para quem está começando as funções de mapa de idiomas do vim.
Primeiro, você precisa de um arquivo de mapa do idioma. Como no exemplo do Caps Lock, você deve colocar algo como o seguinte em
~/.vim/keymap/dvorak2turkishf.vim
(baixe meu mapeamento completo no Githu b):Com isso, resta configurar as ligações para ativá-lo em alguns casos, mas não em outros. Você deseja adicionar algo ao seu
~/.vimrc
arquivo.Primeiro, vincule o mapa de teclas de pesquisa ao de entrada:
Em seguida, defina qual mapa de teclas será usado no modo de entrada de idioma alternativo:
Desative o modo de entrada alternativo para que, por padrão, não haja alterações:
Configure um comando automático para executar sempre que sair do modo de inserção para desativar a opção de idioma alternativo:
Adicione ligações para todas as várias maneiras pelas quais você pode acabar no modo de entrada de idioma alternativo, para que o uso de
<leader>
(Normalmente\
) antes deles ative o swtich do mapa de idiomas antes de alternar:Defina uma cor de cursor diferente para quando o mapa estiver ativado:
Todos juntos, aqui está o que mudou na minha configuração . Como observação final, no modo de inserção, você pode ativar ou desativar a opção de mapa de idiomas usando
<ctrl>+^
.fonte