Vim'de farklı klavyelerle çalışmanın en uygun yolu nedir?


19

Bazen Yunanca kelimeler yazmam gerekir, ancak Yunanca klavyeyi kullandığımda vurmak, söylemek istediğim komut olarak değil, <C-p>anlaşılır <C-π>. Bu ile düzeltilebilir :map <C-p> <C-π>. Bunu bir liste yapmadan tüm harfler için yapabilir miyim?

PS. Hepsinin bir listesini yapmak mükemmel bir sonuç vermez. Örneğin, qbir ;Gr üzerinde. ama eşlemek istemiyoruz; q'ya. Ayrıca, herhangi bir nedenle, ΖΖ (zeta zeta) sonra çalışmaz :map Ζ Z. Ve tanımladığım bir komut \lw, olarak çalışmıyor \λς.


2
Haritalamanın gitmek için iyi bir yol olmadığını düşünüyorum: belki aradığınız şey bir langmapseçenektir ( Yunan düzeni için bir örnek içeren dokümana bakın ). Bu seçenek aslında Yunanca veya Cyrilic gibi latin olmayan klavyelerle uğraşmaya yardımcı olmak için yapıldı. Ekleme modunda normal olarak yorumlanacak, ancak diğer modlarda değiştirilecek sembol çiftlerini tanımlamanızı sağlar, belki bu size yardımcı olacaktır.
statox

@statox: Teşekkürler! Eski kullanmayı denedim. ama hiçbir şey olmadı. Yardım, vim'in + langmap seçeneğine uyulması gerektiğini söylüyor. Bunun olup olmadığını kontrol etmenin kolay bir yolu var mı? Mac OS ile birlikte gelen sürümü kullanıyorum.
18rot

1
Eğer sen-si olmak :echo has('langmap')sen- ebilmek kullanma o sen- ebilmek almak o sen- ebilmek kullanma o bir sen- ebilmek almak 1eğer sen-si olmak a 0.
statox

@statox: Teşekkürler! Ben ile güncelleme brew install vim --override-system-vive :echo has &cşimdi 1 döndürür. ZZ çalışır. \lv& C ile ilgili sorun devam etmektedir.
18/15

Parçayı anlamıyorum, vim derlendiğinde , vimrc'nizdeki eşlemeleri belirtmeniz :echo has &cgerektiğinde bunun nasıl bir şey olduğunu görmüyorum . langmaplangmap:set langmap=ΑA,ΒB,ΨC [...]
statox

Yanıtlar:


6

keymapSorununuzu çözebilecek olan tavsiye ederim . Bunları vimrc'nize koyun

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

Varsayılan olarak Yunanca'yı devre dışı bırakmak için . Ekle modunda ve Değiştir modunda (değil <ctrl>+^de kullanabilirsiniz <ctrl>+6, sembol üzerinde değil, anahtarla eşleştirilir) seçeneğini (çalışmaz Normal mod). Ekleme modundan çıkarken otomatik olarak devre dışı bırakmak için

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

Bunlar hakkında daha fazla bilgi

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


İkinci yorumu DÜZENLE:

Ekleme moduna (ve değiştirme moduna) giriyorsanız otomatik olarak Yunanca'yı açmak ve ayrılırsa otomatik olarak kapatmak için bunu deneyebilirsiniz (o zaman daha önce belirtilen eşlemeye ihtiyacınız yoktur).

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

Politonik Yunanca kullanmak gerçekten gerekli mi? Bana sadece doğru kodlamaya ihtiyaç duyulduğunu ve sonra yerleşik MacOS X girişini kullandığını düşünüyorum. Ama bu muhtemelen benim yanlış izlenimim. Ayrıca MacOS X'te politonik Yunanca klavyeye geçebilirsiniz (ve öğrenebilirsiniz, ancak sanırım aradığınız şey bu değil :-) ἀ gecikmesi hakkında, bazı haritalama olabilir, bulmaya çalışın :map >ave varsa , eşlemesini kaldırın :unmap >a. Yunan ve MacO olmayan bir kullanıcı olarak ben zaten zekâ sonum. Üzgünüm ve iyi şanslar!
ryuichiro

10

Yorumlarda söylediğim gibi, haritalamalar yapmak istediğiniz şeyi yapmak için tasarlanmamıştır. Bu kullanım durumu için ilginç bir seçenek langmap.

Bu seçenek, davranışı veya klavyenizi ekleme modunda tutmanıza ve diğer modlardaki davranışını değiştirmenize olanak tanır.

Kullanmak için Vim'in derlenmesi gerekir +langmap, bu seçeneğin aşağıdakilerle etkinleştirildiğini kontrol edebilirsiniz echo has('langmap'): komut 1seçeneği döndürürse başka etkinleştirilirse, bu seçeneğin etkin olduğu bir kurulum almanız gerekir (bunu nasıl yapacağınızı bilmek için, başka bir soru).

Etkinleştirildiğinde, seçenek, karakter çiftlerini alır; örneğin set langmap += à@, àekleme modundayken arabelleğinize a eklemenize izin verir ve a àyazarsınız à, ancak normal modda yazmak gerçekten bir tetikler @(bu örnek azerty'de yararlı olabilir makrolarla çalışmayı kolaylaştırmak için klavyeler).

Yunan dilinde langmap kullanmak için :h 'langmap'bu satırı eklediğinizde verilen örneği takip edebilirsiniz vimrc (Bu satırı buradan kopyalamak iyi bir fikir olmayabilir çünkü kodlamadan gerçekten emin değilim , satırı doğrudan yardım dosyasından sormak muhtemelen daha güvenli) :

: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

Yorumlarınızda anladığım kadarıyla, önceden tanımlanmış komutları kullanmaya çalıştığınızda bir sorun olmaya devam ediyor: bir komut yazdığınızda, langmap tanımlı davranış yerine ekleme modu davranışı tetiklenecek. Maalesef bunun için iyi bir çözüm bulduğumdan emin değilim. Bir fikir, örneğin komutları yeniden tanımlamak olabilir:

command λς lw

Bu şekilde λςVim komutunu yazdığınızda, lwancak bu yöntemin birkaç dezavantajı görüyorum:

  • Kullanmak istediğiniz tüm komutları yeniden tanımlamak, popoda büyük bir acı olabilir.
  • Kullanıcı tanımlı komutların büyük bir harfle başlaması gerekir ve şimdi bunu Yunanca'da yapmanın ne kadar uygun olduğunu düşünüyorum.

Belki de @Alexander Myshov tarafından bu soruya cevabında önerilen bir eklenti yararlı olabilir (bunlardan hiçbirini denemediğim için sorunu çözüp çözmediklerini bilmiyorum ama öyle görünüyorlar).


1

Düzenli olarak İngilizce ve İsveççe yazıyorum. İsveççe çözmek Yunancadan daha küçük bir problemdir, çünkü İngiliz alfabesini sadece birkaç karakterle genişletir, ancak benim çözümümün Yunancaya aktarılabilir olduğunu düşünüyorum.

İşletim sistemimin sistem klavye anahtarını kullanarak geçiş yapıyordum. Bununla ilgili sorun, OP'nin belirttiği gibi, bir dizi komutu kırmasıdır, çünkü normal modda, her tuş İngilizce olmayan klavyeyle Vim'e başka bir sinyal gönderir. İsveçli klavye düzeninde, dahası, alfabetik olmayan karakterlerden oluşan bir sürü yeni karakterlere yer açmak için taşınır å, äve ö. Örneğin, }Alt-Shift-9 ile yazılır ( İngilizce klavyedeki açılış paranteziyle eşleşir) ve ters eğik çizgi Alt-Shift-7 ile yazılır. Insertmode için vanilya İsveççe klavye düzenine geçmek böylece bir sürü baş ağrısına neden olur.

Benim çözümüm, anahtarları yalnızca insertmode içinde yeniden eşleştirmek ve bu eşlemeleri bir fonksiyona sarmaktı, böylece kolayca ileri geri gidebiliyorum. Aşağıdaki kod bunu nasıl benim .vimrc. Bu sadece ihtiyacım olan karakterleri İsveççe klavye düzenindeki konumlarına ekleyerek diğer her şeyi bırakıyor. Onlar tarafından maskelenmiş karakterleri yazmak için ( ;, :, [, {, ", ve '), ben sadece iki kez tuşuna basın. Neyse ki, sadece aptal insanların iki tane yazması gerekiyoräarka arkaya s. (Bu çift vuruş uygun değilse, bunları Ctrl veya benzeri bir şeyle eşleştirebilirsiniz. Temel ilke, maskelenen karakterlerin klavyedeki yerlerinde kalması, ancak bir tuş vuruşunun gerçekleştirilmesinden çıkarılmasıdır. Bunun anlamı, İsveççe yazmak istediğimde, <Leader>sbu eşlemelere geçiş yapan ve İsveç yazım denetimini uygulayan vururum . Geri dönmek için yapıyorum <Leader>e.

Şimdi, Yunanca için, bu, tüm prensip için eşlemeler yapmayı içerecektir, bu aslında prensibi bir kez indirdiğinizde göründüğünden daha az güçlüktür. Zor kısım, İngilizceye geçerken tüm bu değişikliklerin eşlemesini kaldırmak olacaktır. Belki birisi bunu yapmanın şık bir yolunu bulabilir.

Arapça için sık sık yazdığım diğer bir dil için aşağıdaki gibi bir ekleme işlevi yapmayı planlıyorum. Buraya işlem hakkında rapor vermek için geri gelebilirim.

" 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
Yanılıyor olabilirim ama cevabınızın ekleme modunda İngilizce olmayan karakterleri kolayca girmesine izin verdiğini düşünüyorum, OP'nin problemi ise ekleme modundan başka modlarda kolayca İngilizce karakterleri almaktı. Cevabınızın ilk sorunu çözdüğünden emin değilim. Eşleştirmeleri etkinleştirme / devre dışı bırakma işlevi hala oldukça ilginçtir.
statox

@statox Peki, soruyu yanlış anlamış olabilirim, ancak sorun normal mod işlevlerini korurken ingilizce olmayan karakterleri insertmode kolayca eklemekse, sorumun en azından bu sorunu ele almaya çalıştığına inanıyorum.
Andreas

Üzgünüm demek istemediğim için üzgünüm: Soru ile cevabınız arasında belki bir boşluk olduğunu gösteriyordum ama elbette problemi ele almaya çalışıyorsunuz ve dediğim gibi işlevlerin etkinleştirilmesi fikrini gerçekten seviyorum ve eşlemeleri devre dışı bırakma. Cevabınızı gerçekten inkar etmedim ve kulağa böyle geldiği için gerçekten üzgünüm.
statox

1
@statox İhlal edilmedi. Ve eğer cevabımı reddetmiş olsaydın, hepsi iyi olurdu.
Andreas

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.