Qual è il modo più conveniente per lavorare con diverse tastiere in VIM?


18

A volte ho bisogno di scrivere parole greche, ma quando sto usando la tastiera greca, colpire, diciamo, <C-p>sarà compreso come <C-π>e non come il comando che intendo. Questo può essere risolto con :map <C-p> <C-π>. Posso farlo per tutte le lettere senza fare un elenco di tutte?

PS. Fare un elenco di tutti non produce un risultato perfetto. Ad esempio, qè ;al Gr. tastiera, ma non vogliamo mappare; a q. Inoltre, per qualche motivo, ΖΖ (zeta zeta) non funziona dopo :map Ζ Z. E un comando che ho definito, \lwnon funziona come \λς.


2
Penso che la mappatura non sia la buona strada da percorrere: forse quello che stai cercando è l' langmapopzione (vedi il documento che include un esempio per il layout greco). Questa opzione è stata fatta per aiutare a gestire tastiere non latine come greche o cirilliche. Ti permette di definire coppie di simboli che verranno interpretati normalmente in modalità inserimento ma che verranno sostituiti in altre modalità, forse questo ti aiuterà.
statox

@statox: grazie! Ho provato a usare l'ex. ma non è successo niente. L'aiuto dice che vim doveva essere rispettato con l'opzione + langmap. C'è un modo semplice per verificare se lo fosse? Sto usando la versione fornita con Mac OS.
Toothrot,

1
Puoi usarlo :echo has('langmap')se ne ottieni uno 1se 0ce l'hai non lo fai.
statox

@statox: grazie! Ho aggiornato con brew install vim --override-system-vie :echo has &cora restituisce 1. ZZ funziona. Il problema con \lv& c rimane.
Toothrot,

Non capisco la :echo has &cparte, non vedo come sia correlata langmapanche dopo aver compilato VIM, langmapè necessario specificare le mappature con :set langmap=ΑA,ΒB,ΨC [...]nel VIMRC.
statox

Risposte:


6

Consiglierei keymap, che può risolvere il tuo problema. Metti questi nel tuo vimrc

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

per disabilitare il greco come predefinito. Puoi attivare (greco) e disattivare (inglese) l'opzione usando <ctrl>+^(puoi anche usare <ctrl>+6, è mappato sul tasto, non sul simbolo) in modalità inserimento e Sostituisci (non funziona in Modalità normale). Per disabilitare automaticamente quando si esce dalla modalità di inserimento è possibile utilizzare

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

Altro su questi

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


MODIFICA al secondo commento:

Puoi provare questo per attivare automaticamente il greco, se accedi alla modalità di inserimento (e sostituisci modalità) e per spegnere automaticamente, se lasci (quindi non hai bisogno di mappare menzionato prima).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END

È davvero necessario usare il greco poltonico? Mi sembra che sia necessaria solo la codifica corretta e quindi utilizzare l'input MacOS X incorporato. Ma questa è probabilmente solo la mia impressione sbagliata. Puoi anche passare alla tastiera greca poltonica in MacOS X (e impararla, ma suppongo che non sia quello che cerchi :-) Riguardo al ritardo di ἀ, ci può essere un po 'di mappatura, provare a scoprire da :map >a, e se c'è , scompattalo da :unmap >a. Come utente non greco e non MacOs sono già alle mie spalle. Scusa e buona fortuna!
Ryuichiro,

10

Come ho detto nei commenti, le mappature non sono progettate per fare quello che vuoi fare. Un'opzione interessante per questo caso d'uso è langmap.

Questa opzione consente di mantenere il comportamento o la tastiera in modalità inserimento e modificarne il comportamento nelle altre modalità.

Per usarlo è necessario compilare Vim +langmap, è possibile verificare che questa opzione sia abilitata con echo has('langmap'): se il comando restituisce 1l'opzione è abilitata altrimenti dovrete ottenere una configurazione con questa opzione abilitata (per sapere come farlo, esso è un'altra domanda).

Quando è abilitato, l'opzione accetta coppie di caratteri, ad esempio set langmap += à@ti permetterà di aggiungere un ànel tuo buffer quando sei in modalità inserimento e digiti un àma digitando àin modalità normale in realtà attiverà un @(questo esempio può essere utile su azerty tastiere per facilitare il lavoro con le macro).

Per usare langmap in greco puoi seguire l'esempio dato :h 'langmap'nell'aggiunta di questa riga alla tua vimrc (Copiare questa riga da qui potrebbe non essere una buona idea poiché non sono davvero sicuro della codifica, probabilmente strappare la linea direttamente dal file di aiuto è probabilmente più sicuro) :

: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

Ora, da quello che ho capito nei tuoi commenti, rimane un problema quando si tenta di utilizzare comandi predefiniti: quando si digita un comando, verrà attivato il comportamento in modalità inserimento anziché il comportamento definito langmap. Purtroppo non sono sicuro di avere una buona soluzione per questo. Un'idea potrebbe essere quella di ridefinire i comandi per esempio in questo modo:

command λς lw

In questo modo quando digiterai il comando λςche eseguirà Vim lwma vedo diversi svantaggi di questo metodo:

  • Potrebbe essere un enorme dolore nel culo ridefinire tutti i comandi che vuoi usare.
  • I comandi definiti dall'utente devono iniziare con una lettera maiuscola e ora ho idea di quanto sia conveniente farlo in greco.

Quindi forse un plugin suggerito da @Alexander Myshov nella sua risposta a questa domanda potrebbe essere utile (dato che non ho mai provato nessuno di questi non so se risolvono il problema ma sembra che lo facciano).


1

Scrivo regolarmente in inglese e svedese. Lo svedese è un problema più piccolo da risolvere rispetto al greco perché espande l'alfabeto inglese con pochi caratteri, ma penso che la mia soluzione sia trasferibile al greco.

Prima passavo usando l'interruttore della tastiera del mio sistema operativo. Il problema con questo è, come notato dall'OP, che interrompe un sacco di comandi, poiché in modalità normale, ogni tasto invia un altro segnale a Vim con la tastiera non inglese. Nel layout tastiera svedese, inoltre, un insieme di caratteri non alfabetici vengono spostati per far posto i nuovi caratteri å, äe ö. Ad esempio, }viene digitato con Alt-Shift-9 (corrispondente alla parentesi aperta sulla tastiera inglese) e la barra rovesciata viene digitata con Alt-Shift-7. Il passaggio a un layout di tastiera svedese vaniglia per insertmode provoca quindi un sacco di mal di testa.

La mia soluzione era rimappare le chiavi pertinenti solo in insertmode e racchiudere queste mappature in una funzione in modo da poter passare facilmente avanti e indietro. Il codice qui sotto è come l'ho fatto nel mio .vimrc. Questo aggiunge solo i caratteri di cui ho bisogno alla posizione che hanno nel layout della tastiera svedese, lasciando tutto il resto. Per digitare i caratteri che vengono mascherati da loro ( ;, :, [, {, ", e '), ho semplicemente ha colpito due volte il tasto. Fortunatamente, solo le persone sciocche devono anche digitare dueädi fila. (Se questa doppia battuta non è adatta, è possibile mapparli su Ctrl o qualcosa del genere. Il principio di base è che i personaggi mascherati restano al loro posto sulla tastiera, ma viene rimosso un solo tasto dalla realizzazione. Lo trovo molto più facile piuttosto che spostarli.) Ciò che significa è che quando voglio digitare in svedese, premo <Leader>s, che passa a queste mappature e applica il controllo ortografico svedese. Per tornare indietro, lo faccio <Leader>e.

Ora, per il greco, ciò implicherebbe la creazione di mappature per l'intero alfabeto, che in realtà è meno seccante di quanto sembri una volta abbattuto il principio. La parte difficile sarebbe quindi annullare la mappatura di tutte queste modifiche quando si passa all'inglese. Forse qualcuno può escogitare un modo elegante per farlo.

Sto programmando di eseguire una funzione di inserimento come quella sotto per l'arabo, l'altra lingua che scrivo spesso. Potrei tornare qui per riferire sul 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>

1
Potrei sbagliarmi, ma penso che la tua risposta permetta di ottenere facilmente caratteri non inglesi in modalità inserimento mentre il problema di OP era di ottenere facilmente caratteri inglesi in altre modalità rispetto alla modalità inserimento. Non sono sicuro che la tua risposta risolva il problema iniziale. L'idea di abilitare / disabilitare le mappature delle funzioni è piuttosto interessante.
statox

@statox Beh, potrei aver frainteso la domanda, ma se il problema è inserire facilmente caratteri non inglesi in insertmode mantenendo le normali modalità, credo che la mia domanda almeno provi ad affrontare quel problema.
Andreas,

Mi dispiace non intendevo offendere: stavo sottolineando che c'era forse un divario tra la domanda e la tua risposta, ma ovviamente cerchi di affrontare il problema e come ho detto, mi piace molto l'idea di abilitare le funzioni e disabilitazione dei mapping. Non stavo davvero negando la tua risposta e mi dispiace davvero per quello che sembrava.
statox

1
@statox Nessuna offesa. E se tu avessi negato la mia risposta, sarebbe tutto in ordine.
Andreas,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.