Quelle est la façon la plus pratique de travailler avec différents claviers dans vim?

18

J'ai parfois besoin d'écrire des mots grecs, mais lorsque j'utilise le clavier grec, frapper, par exemple, <C-p>sera compris comme <C-π>et non comme la commande que j'ai l'intention. Cela peut être corrigé avec :map <C-p> <C-π>. Puis-je faire cela pour toutes les lettres sans faire une liste de toutes?

PS. Faire une liste de tous ne produit pas un résultat parfait. Par exemple, qest ;sur le Gr. clavier, mais nous ne voulons pas mapper; à q. De plus, pour une raison quelconque, ΖΖ (zeta zeta) ne fonctionne pas après :map Ζ Z. Et une commande que j'ai définie \lw, ne fonctionne pas comme \λς.

Toothrot
la source
2
Je pense que la cartographie n'est pas la bonne voie à suivre: peut-être que ce que vous recherchez est l' langmapoption (voir le document qui comprend un exemple de mise en page grecque). Cette option a été faite pour aider à gérer les claviers non latins comme le grec ou le cyrilique. Il vous permet de définir des paires de symboles qui seront interprétées normalement en mode insertion mais seront remplacées dans d'autres modes, peut-être que cela vous aidera.
statox
@statox: Merci! J'ai essayé d'utiliser l'ex. mais rien ne s'est passé. L'aide indique que vim devait être respecté avec l'option + langmap. Existe-t-il un moyen facile de vérifier si c'était le cas? J'utilise la version fournie avec Mac OS.
Toothrot
1
Vous pouvez l'utiliser :echo has('langmap')si vous en avez un 1si vous en avez un 0.
statox
@statox: Merci! J'ai mis à jour avec brew install vim --override-system-viet :echo has &cretourne maintenant 1. ZZ fonctionne. Le problème avec \lv& c persiste.
Toothrot
Je ne comprends pas la :echo has &cpartie, je ne vois pas à quoi elle est liée langmapaussi une fois que vous avez compilé vim, langmapvous devez spécifier les mappages avec :set langmap=ΑA,ΒB,ΨC [...]dans votre vimrc.
statox

Réponses:

6

Je recommanderais keymap, ce qui peut résoudre vos problèmes. Mettez-les dans votre vimrc

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

pour désactiver le grec par défaut.Vous pouvez activer ou désactiver l'option (grec) et désactiver (anglais) en utilisant <ctrl>+^(vous pouvez également utiliser <ctrl>+6, il est mappé sur la clé, pas sur le symbole) en mode insertion et en mode remplacement (ne fonctionne pas dans Mode normal). Pour désactiver automatiquement lorsque vous quittez le mode d'insertion, vous pouvez utiliser

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

Plus sur ces

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


MODIFIER le deuxième commentaire:

Vous pouvez essayer cela pour activer le grec automatiquement, si vous entrez en mode insertion (et remplacez le mode), et pour désactiver automatiquement, si vous quittez (alors vous n'avez pas besoin du mappage mentionné précédemment).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END
ryuichiro
la source
Est-il vraiment nécessaire d'utiliser du grec polytonique? Il me semble que seul un bon encodage est nécessaire, puis d'utiliser une entrée MacOS X intégrée. Mais c'est probablement juste ma mauvaise impression. Vous pouvez également passer au clavier grec polytonique dans MacOS X (et l'apprendre, mais je suppose que ce n'est pas ce que vous recherchez :-) À propos du décalage de ἀ, il peut y avoir un mappage, essayez de le découvrir par :map >a, et s'il y a , démappez-le par :unmap >a. En tant qu'utilisateur non grec et non MacOs, je suis déjà à bout de souffle. Désolé et bonne chance!
ryuichiro
10

Comme je l'ai dit dans les commentaires, les mappages ne sont pas conçus pour faire ce que vous voulez faire. Une option intéressante pour ce cas d'utilisation est langmap.

Cette option permet de conserver le comportement ou votre clavier en mode insertion et de changer son comportement dans les autres modes.

Pour l'utiliser, Vim doit être compilé avec +langmap, vous pouvez vérifier que cette option est activée avec echo has('langmap'): si la commande retourne 1l'option est activée sinon vous devrez obtenir une configuration avec cette option activée (pour savoir comment faire, il est une autre question).

Lorsqu'elle est activée, l'option prend des paires de caractères par exemple set langmap += à@vous permettra d'ajouter un àdans votre tampon lorsque vous êtes en mode insertion et que vous tapez a àmais taper àen mode normal déclenchera en fait un @(cet exemple peut être utile sur azerty claviers pour faciliter le travail avec les macros).

Pour utiliser langmap en grec, vous pouvez suivre l'exemple donné en :h 'langmap'ajoutant cette ligne à votre vimrc (Copier cette ligne à partir d'ici peut ne pas être une bonne idée car je ne suis vraiment pas sûr de l'encodage, retirer la ligne directement du fichier d'aide est probablement plus sûr) :

: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

Maintenant, d'après ce que je comprends dans vos commentaires, cela reste un problème lorsque vous essayez d'utiliser des commandes prédéfinies: lorsque vous tapez une commande, le comportement du mode d'insertion sera déclenché à la place du comportement défini par langmap. Malheureusement, je ne suis pas sûr d'avoir une bonne solution pour cela. Une idée pourrait être de redéfinir des commandes par exemple comme ça:

command λς lw

De cette façon, lorsque vous taperez la commande que λςVim exécutera, lwmais je vois plusieurs inconvénients à cette méthode:

  • Il pourrait être très difficile de redéfinir toutes les commandes que vous souhaitez utiliser.
  • Les commandes définies par l'utilisateur doivent commencer par une majuscule, et j'ai maintenant idée à quel point il est pratique de le faire en grec.

Alors peut-être qu'un plugin suggéré par @Alexander Myshov dans sa réponse à cette question pourrait être utile (comme je n'en ai jamais essayé, je ne sais pas s'ils résolvent le problème, mais il semble qu'ils le fassent).

statox
la source
1

Je tape régulièrement en anglais et en suédois. Le suédois est un problème plus petit à résoudre que le grec car il ne développe que l'alphabet anglais avec quelques caractères, mais je pense que ma solution est transférable au grec.

J'avais l'habitude de changer à l'aide du commutateur de clavier système de mon système d'exploitation. Le problème avec cela est, comme l'OP l'a noté, qu'il casse tout un tas de commandes, car en mode normal, chaque touche envoie un autre signal à Vim avec le clavier non anglais. Dans la configuration du clavier suédois, en outre, un tas de caractères non alphabétiques sont déplacés pour faire place aux nouveaux personnages å, äet ö. Par exemple, }est tapé avec Alt-Shift-9 (correspondant à la parenthèse d' ouverture sur le clavier anglais), et la barre oblique inverse est tapée avec Alt-Shift-7. Le passage à une disposition de clavier suédoise vanille pour le mode d'insertion provoque donc tout un tas de maux de tête.

Ma solution a été de remapper les clés pertinentes en mode insertion uniquement et d'envelopper ces mappages dans une fonction afin que je puisse facilement basculer d'avant en arrière. Le code ci-dessous montre comment j'ai fait cela dans mon .vimrc. Cela n'ajoute que les caractères dont j'ai besoin à la position qu'ils ont dans la disposition du clavier suédois, laissant tout le reste. Pour saisir les caractères qui sont masqués par eux ( ;, :, [, {, ", et '), je simplement frappé deux fois la touche. Heureusement, seules les personnes stupides ont même besoin de taper deuxäs dans une rangée. (Si cette double frappe ne convient pas, vous pouvez les mapper sur Ctrl ou quelque chose comme ça. Le principe de base est que les caractères masqués restent à leur place sur le clavier mais ne sont plus en cours de réalisation. Je trouve cela beaucoup plus facile que de les déplacer.) Ce qui veut dire que lorsque je veux taper du suédois, je tape <Leader>s, qui bascule vers ces mappages et applique la vérification orthographique suédoise. Pour revenir en arrière, je le fais <Leader>e.

Maintenant, pour le grec, cela impliquerait de faire des mappages pour l'ensemble de l'alphabet, ce qui est en fait moins compliqué qu'il n'y paraît une fois que vous avez mis le principe en place. La partie délicate serait alors de démapper toutes ces modifications lors du passage à l'anglais. Peut-être que quelqu'un peut trouver une façon astucieuse de le faire.

Je prévois de faire une fonction d'insertion comme celles ci-dessous pour l'arabe, l'autre langue que je tape souvent. Je pourrais revenir ici pour rendre compte du processus.

" 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
la source
1
Je peux me tromper, mais je pense que votre réponse permet d'obtenir facilement des caractères non anglais en mode insertion alors que le problème d'OP était d'obtenir facilement des caractères anglais dans d'autres modes que le mode insertion. Je ne suis pas sûr que votre réponse réponde au problème initial. L'idée d'activer / désactiver les mappages de fonction est toujours très intéressante.
statox
@statox Eh bien, j'ai peut-être mal compris la question, mais si le problème est d'insérer facilement des caractères non anglais dans insertmode tout en conservant des fonctions en mode normal, je crois que ma question tente au moins de résoudre ce problème.
Andreas
Je suis désolé, je ne voulais pas offenser: je soulignais qu'il y avait peut-être un écart entre la question et votre réponse, mais bien sûr, vous essayez de résoudre le problème et, comme je l'ai dit, j'aime vraiment l'idée de fonctions permettant et désactiver les mappages. Je ne nie vraiment pas votre réponse et je suis vraiment désolé de ce à quoi cela ressemblait.
statox
1
@statox Aucune infraction n'a été prise. Et si vous aviez nié ma réponse, tout serait en ordre.
Andreas