Como posso ligar duas ações distintas para Ctrl-Shift-Key e Ctrl-Key no vi

4

Estou tentando mapear duas ações diferentes para, por exemplo, Ctrl Deslocamento a e Ctrl a :

map <C-S-a>    :echo "ctrl-shift-a received"<CR>
map <C-a>      :echo "ctrl-a received"<CR>

Mas tudo que recebo ao pressionar qualquer um dos dois é a saída "ctrl-a received" na linha de status. Aparentemente, o vi não vê uma diferença entre um caractere de controle capitalizado e um caractere minúsculo.

Existe uma maneira de mudar isso?

Estou executando o vi (v7.4) em um xterm (X.Org 6.8.99).

    
por cfi 23.09.2015 / 08:19

1 resposta

5

Esta é uma restrição de terminal, porque vi os códigos de teclas como sendo os mesmos. Pode-se verificar isso entrando no modo de inserção i , pressionando Ctrl v para colocar o vi em um modo para esperar a entrada literal de um especial personagem e depois bateu por exemplo Ctrl Desloca a . Uma saída ^A será exibida. Agora faça a seqüência Ctrl v , Ctrl a , e novamente um ^A aparecerá: ambas as seqüências de entrada resultar no mesmo código de teclado sendo visto pelo vi.

Para terminais como xterm , você pode alterar isso. Para gnome-terminal que ignora as configurações dos recursos do X eu não sei como fazer o seguinte:

Esta pergunta SO aborda o mesmo tópico e este exemplo mostra isso em uso para mapeamento de múltiplas chaves no arquivo .Xresources . Por exemplo:

XTerm*vt100.translations: #override \
  Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n\
  Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n\ 
  Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")  

Agora temos sequências de teclas diferentes no vi para Ctrl a vs. Ctrl Deslocamento a , Ctrl b vs. Ctrl Deslocamento b , < kbd> Ctrl f vs. Ctrl Deslocamento f .

Agora podemos mapeá-los de forma diferente em ~/.vimrc :

map <ESC>[65;5u   :echo "ctrl-shift-a received"<CR>
map <C-a>         :echo "ctrl-a received"<CR>
    
por 23.09.2015 / 08:19