Was ist die bequemste Art, mit verschiedenen Tastaturen in vim zu arbeiten?

18

Manchmal muss ich griechische Wörter schreiben, aber wenn ich die griechische Tastatur benutze, <C-p>wird das Drücken beispielsweise als <C-π>und nicht als der Befehl verstanden, den ich beabsichtige. Dies kann mit behoben werden :map <C-p> <C-π>. Kann ich dies für alle Briefe tun, ohne eine Liste aller zu erstellen?

PS. Eine Liste von allen zu erstellen, führt nicht zu einem perfekten Ergebnis. ZB qist ;auf der Gr. Tastatur, aber wir wollen nicht abbilden; zu q. Aus irgendeinem Grund funktioniert ΖΖ (Zeta Zeta) auch nicht nach :map Ζ Z. Und ein Befehl, den ich definiert habe \lw, funktioniert nicht als \λς.

Toothrot
quelle
2
Ich denke, dass Mapping nicht der richtige Weg ist: Vielleicht suchen Sie nach der langmapOption (siehe das Dokument, das ein Beispiel für das griechische Layout enthält). Diese Option wurde speziell für den Umgang mit nicht lateinischen Tastaturen wie Griechisch oder Kyrillisch entwickelt. Hier können Sie Symbolpaare definieren, die im Einfügemodus normal interpretiert, aber in anderen Modi ersetzt werden. Vielleicht hilft dies Ihnen.
statox
@statox: Danke! Ich habe versucht, den Ex zu benutzen. aber nichts ist passiert. Die Hilfe besagt, dass vim mit der Option + langmap konform sein musste. Gibt es eine einfache Möglichkeit, um zu überprüfen, ob es war? Ich verwende die Version, die mit Mac OS geliefert wird.
Toothrot
1
Sie können verwenden, :echo has('langmap')wenn Sie eine 1haben, wenn Sie eine 0nicht haben.
statox
@statox: Danke! Ich habe mit aktualisiert brew install vim --override-system-viund :echo has &ckehre jetzt zu 1 zurück. ZZ funktioniert. Das Problem mit \lv& c bleibt bestehen.
Toothrot
Ich verstehe den :echo has &cTeil nicht, ich verstehe nicht, wie er sich darauf bezieht, langmapauch wenn Sie vim kompiliert langmaphaben und die Zuordnungen :set langmap=ΑA,ΒB,ΨC [...]in Ihrem vimrc angeben müssen.
statox

Antworten:

6

Ich würde empfehlen keymap, was dein Problem lösen kann. Legen Sie diese in Ihr vimrc

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

Standardmäßig deaktivieren Sie Griechisch. Sie können die Option aktivieren (Griechisch) und deaktivieren (Englisch), indem <ctrl>+^Sie <ctrl>+6im Einfügemodus und im Ersetzungsmodus (funktioniert nicht in ) (Sie können sie auch verwenden , wenn sie auf die Taste und nicht auf das Symbol abgebildet ist) Normaler Modus). Zum automatischen Deaktivieren beim Verlassen des Einfügemodus können Sie verwenden

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

Mehr dazu

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


BEARBEITEN zum zweiten Kommentar:

Sie können dies versuchen, um Griechisch automatisch einzuschalten, wenn Sie in den Einfügemodus (und Ersetzungsmodus) wechseln, und um es automatisch auszuschalten, wenn Sie den Modus verlassen (dann benötigen Sie die oben erwähnte Zuordnung nicht).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END
Ryuichiro
quelle
Ist es wirklich notwendig, polytonisches Griechisch zu verwenden? Es scheint mir, dass nur die richtige Codierung benötigt wird, um dann die eingebaute MacOS X-Eingabe zu verwenden. Aber das ist wahrscheinlich nur mein falscher Eindruck. Sie können in MacOS X auch auf die polytonische griechische Tastatur umschalten (und sie lernen, aber ich denke, Sie suchen nicht danach :-) Über die Verzögerung von ἀ kann es einige Zuordnungen geben, versuchen Sie es herauszufinden :map >a, und ob es welche gibt , entfernen Sie die Zuordnung von :unmap >a. Als Nicht-Grieche und Nicht-MacOs-User bin ich schon am Ende. Entschuldigung und viel Glück!
Ryuichiro
10

Wie ich in den Kommentaren sagte, sind Zuordnungen in nicht dafür ausgelegt, das zu tun, was Sie tun möchten. Eine interessante Option für diesen Anwendungsfall ist langmap.

Mit dieser Option können Sie das Verhalten oder die Tastatur im Einfügemodus belassen und das Verhalten in den anderen Modi ändern.

Um es zu verwenden, mit dem Vim kompiliert werden muss +langmap, können Sie überprüfen, ob diese Option aktiviert ist echo has('langmap'): Wenn der Befehl zurückgibt, ist 1die Option aktiviert, andernfalls müssen Sie ein Setup mit dieser Option durchführen (um zu wissen, wie das geht, muss sie aktiviert sein) ist eine andere Frage).

Wenn diese Option aktiviert ist, set langmap += à@können Sie bei Verwendung von Zeichenpaaren beispielsweise àim Einfügemodus ein in den Puffer einfügen, und Sie geben ein ein à, bei Eingabe àim normalen Modus wird jedoch tatsächlich ein ausgelöst @(dieses Beispiel kann bei Azerty hilfreich sein) Tastaturen, um die Arbeit mit Makros zu erleichtern).

Zur Nutzung langmap in der griechischen können Sie das Beispiel in bestimmten folgen dem :h 'langmap'Hinzufügen dieser Zeile in vimrc (Kopieren Sie diese Zeile von hier kann nicht eine gute Idee sein , da ich bin wirklich nicht sicher , ob die Codierung, die Zeile direkt aus der Hilfedatei zerren ist wahrscheinlich sicherer) :

: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

Nach dem, was ich in Ihren Kommentaren verstehe, bleibt es ein Problem, wenn Sie versuchen, vordefinierte Befehle zu verwenden: Wenn Sie einen Befehl eingeben, wird das Verhalten des Einfügemodus anstelle des von der Langmap definierten Verhaltens ausgelöst. Leider bin ich mir nicht sicher, ob ich dafür eine gute Lösung habe. Eine Idee könnte darin bestehen, Befehle wie folgt neu zu definieren:

command λς lw

Auf diese Weise λςwird Vim ausgeführt lw, wenn Sie den Befehl eingeben. Diese Methode weist jedoch einige Nachteile auf:

  • Es kann sehr schmerzhaft sein, alle Befehle, die Sie verwenden möchten, neu zu definieren.
  • Benutzerdefinierte Befehle müssen mit einem Großbuchstaben beginnen, und ich habe jetzt eine Vorstellung davon, wie bequem es ist, dies auf Griechisch zu tun.

Vielleicht könnte ein Plugin, das @Alexander Myshov in seiner Antwort auf diese Frage vorgeschlagen hat, nützlich sein (da ich keines davon ausprobiert habe, weiß ich nicht, ob sie das Problem lösen, aber es scheint, als ob sie es tun).

statox
quelle
1

Ich schreibe regelmäßig in Englisch und Schwedisch. Schwedisch ist ein kleineres Problem als Griechisch, da es das englische Alphabet nur um wenige Zeichen erweitert, aber ich denke, dass meine Lösung auf Griechisch übertragbar ist.

Ich habe früher mit dem Tastaturschalter meines Betriebssystems gewechselt. Das Problem dabei ist, wie das OP feststellte, dass es eine ganze Reihe von Befehlen unterbricht, da im normalen Modus jede Taste mit der nicht-englischen Tastatur ein anderes Signal an Vim sendet. In dem schwedischen Tastaturlayout darüber hinaus eine ganze Reihe von nicht-alphabetischen Zeichen bewegt Art und Weise für die neuen Charaktere zu machen å, äund ö. Wird zum Beispiel }mit Alt-Shift-9 (passend zur öffnenden Klammer auf der englischen Tastatur) und Backslash mit Alt-Shift-7 eingegeben. Die Umstellung auf ein vanille schwedisches Tastaturlayout für den Einfügemodus verursacht daher eine ganze Reihe von Kopfschmerzen.

Meine Lösung bestand darin, die relevanten Tasten nur im Einfügemodus neu zuzuordnen und diese Zuordnungen in eine Funktion zu verpacken, damit ich problemlos hin und her wechseln kann. Der folgende Code ist, wie ich das in meinem getan habe .vimrc. Dadurch werden nur die Zeichen hinzugefügt, die ich benötige, und alles andere bleibt übrig. Um die Zeichen , die von ihnen maskiert ( ;, :, [, {, ", und '), schlug ich einfach die Taste zweimal. Zum Glück müssen nur dumme Leute sogar zwei eingebenäs in einer Reihe. (Wenn dieser Doppelschlag nicht geeignet ist, können Sie sie Strg oder ähnlichem zuordnen. Das Grundprinzip ist, dass maskierte Zeichen an ihrer Stelle auf der Tastatur bleiben, aber nur ein Tastendruck entfernt wird. Ich finde das viel einfacher Das heißt, wenn ich <Leader>sSchwedisch eingeben möchte, drücke ich , um zu diesen Zuordnungen zu wechseln und die schwedische Rechtschreibprüfung anzuwenden. Um zurück zu schalten, tue ich <Leader>e.

Für Griechisch bedeutet dies, dass Sie Zuordnungen für das gesamte Alphabet vornehmen müssen. Dies ist eigentlich weniger mühsam, als es sich anhört, wenn Sie das Prinzip einmal festgelegt haben. Der schwierige Teil wäre dann, alle diese Änderungen aufzuheben, wenn Sie auf Englisch wechseln. Vielleicht kann sich jemand einen raffinierten Weg einfallen lassen, um das zu tun.

Ich plane eine Einfügefunktion wie die folgende für Arabisch, die andere Sprache, die ich oft eintippe. Vielleicht komme ich hierher zurück, um über den Vorgang zu berichten.

" 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
quelle
1
Ich könnte mich irren, aber ich denke, dass Ihre Antwort es erlaubt, nicht-englische Zeichen im Einfügemodus zu erhalten, während das Problem von OP darin bestand, englische Zeichen in anderen Modi als dem Einfügemodus zu erhalten. Ich bin nicht sicher, ob Ihre Antwort das ursprüngliche Problem behebt. Trotzdem ist die Idee der Funktion zum Aktivieren / Deaktivieren von Zuordnungen sehr interessant.
statox
@statox Nun, ich könnte die Frage falsch verstanden haben, aber wenn das Problem darin besteht, nicht-englische Zeichen in den Einfügemodus einzufügen, während die Normalmodusfunktionen beibehalten werden, glaube ich, dass meine Frage zumindest versucht, dieses Problem zu lösen.
Andreas
Es tut mir leid, dass ich nicht beleidigend sein wollte: Ich habe darauf hingewiesen, dass es möglicherweise eine Lücke zwischen der Frage und Ihrer Antwort gibt, aber Sie versuchen natürlich, das Problem anzugehen, und wie gesagt, die Idee, Funktionen zu aktivieren, gefällt mir wirklich und Deaktivieren von Zuordnungen. Ich habe deine Antwort wirklich nicht geleugnet und es tut mir wirklich leid, dass es so klang.
statox
1
@statox Keine Straftat. Und wenn Sie meine Antwort verweigert hätten, wäre alles in Ordnung.
Andreas