Qual é a maneira mais conveniente de trabalhar com diferentes teclados no vim?

18

Às vezes, preciso escrever palavras gregas, mas quando estou usando o teclado grego, pressionar, digamos, <C-p>será entendido como <C-π>e não como o comando que pretendo. Isso pode ser corrigido com :map <C-p> <C-π>. Posso fazer isso para todas as cartas sem fazer uma lista de todas?

PS. Fazer uma lista de tudo não produz um resultado perfeito. Por exemplo, qestá ;no Gr. teclado, mas não queremos mapear; para q. Além disso, por algum motivo, ΖΖ (zeta zeta) não funciona depois :map Ζ Z. E um comando que eu defini \lw,, não funciona como \λς.

Toothrot
fonte
2
Eu acho que o mapeamento não é o melhor caminho a seguir: talvez o que você esteja procurando seja a langmapopção (consulte o documento que inclui um exemplo de layout grego). Essa opção foi realmente feita para ajudar a lidar com teclados não latinos, como grego ou cirílico. Permite definir pares de símbolos que serão interpretados normalmente no modo de inserção, mas serão substituídos em outros modos; talvez isso ajude você.
statox
@statox: Obrigado! Eu tentei usar o ex. mas nada aconteceu. A ajuda diz que o vim precisava ser cumprido com a opção + langmap. Existe uma maneira fácil de verificar se foi? Estou usando a versão que acompanha o Mac OS.
Toothrot
1
Você pode usar :echo has('langmap')se tiver um 1, se 0tiver, não.
statox
@statox: Obrigado! Eu atualizei com brew install vim --override-system-vie :echo has &cagora retorna 1. ZZ funciona. O problema com o \lv& c permanece.
Toothrot
Eu não entendo a :echo has &cparte, não vejo como ela está relacionada langmaptambém depois que o vim foi compilado, langmapvocê deve especificar os mapeamentos :set langmap=ΑA,ΒB,ΨC [...]no vimrc.
statox

Respostas:

6

Eu recomendaria keymap, o que pode resolver seu problema. Coloque-os no seu vimrc

" set keymap=greek_utf-8
set iminsert=0
set imsearch=-1

para desativar o grego como padrão. Você pode ativar (grego) e desativar (inglês) a opção usando <ctrl>+^(você também pode usar <ctrl>+6, ele está mapeado na tecla, não no símbolo) nos modos de inserção e Substituir (não funciona no Modo normal). Para desativar automaticamente ao sair do modo de inserção, você pode usar

inoremap <ESC> <ESC>:set iminsert=0<CR>

Mais sobre estes

:h iminsert :h keymap :h imsearch :h i_CTRL-^


EDITAR para o segundo comentário:

Você pode tentar isso para ativar o grego automaticamente, se entrar no modo de inserção (e modo de substituição), e para desligar automaticamente, se sair (não precisará do mapeamento mencionado anteriormente).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END
Ryuichiro
fonte
É realmente necessário usar o grego politônico? Parece-me que apenas a codificação correta é necessária e, em seguida, para usar a entrada interna do MacOS X. Mas esta é provavelmente apenas a minha impressão errada. Você também pode mudar para o teclado grego politônico no MacOS X (e aprendê-lo, mas acho que não é o que você procura :-) Sobre o atraso de ἀ, pode haver algum mapeamento, tente descobrir por :map >ae, se houver , remova o mapeamento por :unmap >a. Como usuário não-grego e não-MacOs, já estou no meu juízo final. Desculpe e boa sorte!
Ryuichiro # 20/15
10

Como eu disse nos comentários, os mapeamentos no não são projetados para fazer o que você deseja fazer. Uma opção interessante para esse caso de uso é langmap.

Esta opção permite manter o comportamento ou o teclado no modo de inserção e alterar o comportamento nos outros modos.

Para usá-lo, o Vim precisa ser compilado +langmap, você pode verificar se esta opção está ativada com echo has('langmap'): se o comando retornar 1a opção está ativada, caso contrário, você precisará fazer uma configuração com esta opção ativada (para saber como fazer isso, é outra questão).

Quando está ativada, a opção aceita pares de caracteres, por exemplo set langmap += à@, permitirá que você adicione a àno seu buffer quando estiver no modo de inserção e você digitar a, àmas digitar àno modo normal acionará a @(este exemplo pode ser útil no azerty teclados para facilitar o trabalho com macros).

Para usar o langmap em grego, você pode seguir o exemplo dado ao :h 'langmap'adicionar esta linha ao seu vimrc (Copiar esta linha daqui pode não ser uma boa ideia, pois não tenho muita certeza da codificação, é provável que puxar a linha diretamente do arquivo de ajuda mais seguro) :

:set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz

Agora, pelo que entendi nos seus comentários, permanece um problema quando você tenta usar comandos predefinidos: quando você digita um comando, o comportamento do modo de inserção será acionado em vez do comportamento definido pelo langmap. Infelizmente, não tenho certeza se tenho uma boa solução para isso. Uma idéia poderia ser redefinir comandos, por exemplo, assim:

command λς lw

Dessa forma, quando você digitar o comando o λςVim executará, lwmas vejo várias desvantagens desse método:

  • Pode ser uma grande dor de cabeça redefinir todos os comandos que você deseja usar.
  • Os comandos definidos pelo usuário precisam começar com uma letra maiúscula, e agora tenho uma ideia de como é conveniente fazer isso em grego.

Talvez um plugin sugerido por @Alexander Myshov em sua resposta a essa pergunta possa ser útil (como eu nunca tentei nenhum deles, não sei se eles resolvem o problema, mas parece que sim).

statox
fonte
1

Eu digito regularmente em inglês e sueco. O sueco é um problema menor de resolver do que o grego, porque só expande o alfabeto inglês com alguns caracteres, mas acho que minha solução é transferível para o grego.

Eu costumava mudar usando o teclado do sistema do meu sistema operacional. O problema é que, como observou o OP, ele quebra vários comandos, pois no modo normal, cada tecla envia outro sinal ao Vim com o teclado que não é o inglês. No layout de teclado sueco, além disso, todo um conjunto de caracteres não-alfabéticos são movidos para abrir caminho para os novos personagens å, äe ö. Por exemplo, }é digitado com Alt-Shift-9 (correspondendo ao parêntese de abertura no teclado inglês) e a barra invertida é digitada com Alt-Shift-7. Mudar para um layout de teclado sueco de baunilha para insertmode, portanto, causa um monte de dores de cabeça.

Minha solução foi remapear as chaves relevantes apenas no modo insert e agrupar esses mapeamentos em uma função para que eu possa alternar facilmente. O código abaixo é como eu fiz isso no meu .vimrc. Isso adiciona apenas os caracteres necessários à posição que eles têm no layout do teclado sueco, deixando todo o resto. Para digitar os caracteres que são mascarados por eles ( ;, :, [, {, ", e '), eu simplesmente pressione a tecla duas vezes. Felizmente, apenas pessoas tolas precisam digitar duasäs em uma fileira. (Se esse toque duplo não for adequado, você poderá mapeá-los para Ctrl ou algo assim. O princípio básico é que os caracteres mascarados permaneçam em seu lugar no teclado, mas uma tecla foi removida da realização. Acho isso muito mais fácil do que movê-los.) O que significa é que, quando quero digitar sueco, eu clico em <Leader>s, que muda para esses mapeamentos e aplica a verificação ortográfica sueca. Para voltar, eu faço <Leader>e.

Agora, para o grego, isso envolveria mapeamentos para todo o alfabeto, o que é realmente menos trabalhoso do que parece quando você aprova o princípio. A parte complicada seria remover o mapeamento de todas essas alterações ao mudar para o inglês. Talvez alguém possa ter uma maneira bacana de fazer isso.

Estou planejando executar uma função de inserção como as abaixo para o árabe, o outro idioma que digito com frequência. Posso voltar aqui para relatar o processo.

" Switch to Swedish
function! SweType()
  set spelllang=sv
  inoremap ; ö
  inoremap ;; ;
  inoremap : Ö
  inoremap :: :
  inoremap [ å
  inoremap { Å
  inoremap ' ä
  inoremap '' '
  inoremap " Ä
  inoremap "" "
  inoremap [[ [
  inoremap {{ {
endfunction
nmap <Leader>s :<C-U>call SweType()<CR>


" Switch to English
function! EngType()
  set spelllang=en_us
  inoremap ; ;
  iunmap ;;
  inoremap : :
  iunmap ::
  inoremap [ [
  iunmap [[
  inoremap { {
  iunmap {{
  inoremap ' '
  iunmap ''
  inoremap " "
  iunmap ""
endfunction
nmap <Leader>e :<C-U>call EngType()<CR>
Andreas
fonte
1
Posso estar errado, mas acho que sua resposta permite obter facilmente caracteres não ingleses no modo de inserção, enquanto o problema do OP era obter facilmente caracteres em inglês em outros modos que não o modo de inserção. Não sei se sua resposta aborda o problema inicial. Ainda assim, a ideia da função de habilitar / desabilitar os mapeamentos é bastante interessante.
statox
@statox Bem, eu posso ter entendido mal a pergunta, mas se o problema é inserir caracteres não ingleses facilmente no insertmode, mantendo as funções do modo normal, acredito que minha pergunta pelo menos tente resolver esse problema.
Andreas
Me desculpe, eu não quis ser ofensivo: eu estava apontando que talvez houvesse uma lacuna entre a pergunta e sua resposta, mas é claro que você tenta resolver o problema e, como eu disse, eu realmente gosto da ideia de funções ativando e desativando mapeamentos. Eu realmente não estava negando sua resposta e sinto muito pelo que parecia.
statox
1
@statox Sem ofensa. E se você tivesse negado minha resposta, tudo estaria em boa ordem.
Andreas