vimで異なるキーボードを操作する最も便利な方法は何ですか?


18

私は時々ギリシャ語の単語を書く必要がありますが、ギリシャ語のキーボードを使用しているとき、打つことは、たとえば、意図するコマンド<C-p>として<C-π>ではなく、理解されるでしょう。これはで修正できます:map <C-p> <C-π>。すべてのリストを作成せずにすべての文字に対してこれを実行できますか?

PS。すべてのリストを作成しても、完璧な結果は得られません。例えば、qある;Grの上。キーボード、ただしマッピングしたくない; qへ また、何らかの理由で、after(zeta zeta)は後に機能しません:map Ζ Z。そして、私が定義したコマンドは、\lwとして機能しません\λς


2
マッピングは良い方法ではないと思います:おそらくあなたが探しているのはlangmapオプションです(ギリシャ語のレイアウトの例を含むドキュメントを参照してください)。このオプションは、ギリシャ語やキリル文字などの非ラテン語キーボードの処理を支援するために実際に作成されました。挿入モードでは通常解釈されるが、他のモードでは置き換えられるシンボルのペアを定義できます。これはおそらく役立つでしょう。
statox

@statox:ありがとう!元を使ってみました。しかし、何も起こりませんでした。ヘルプには、vimが+ langmapオプションに準拠しなければならないと書かれています。それがあったかどうかを確認する簡単な方法はありますか?Mac OSに付属のバージョンを使用しています。
歯磨き

1
あなたが:echo has('langmap')得るなら、1あなたはそれを持っているなら、あなたはそれを持っているなら、あなたはそれを持っている0ことができます。
statox

@statox:ありがとう!で更新しbrew install vim --override-system-vi:echo has &c現在1を返します。ZZは動作します。\lv&c の問題は残ります。
歯磨き

私はその:echo has &c部分を理解していません。vimrcでマッピングを指定langmaplangmapなければならないので、vimをコンパイルした後の関係もわかりません:set langmap=ΑA,ΒB,ΨC [...]
statox

回答:


6

keymapあなたのトラブルを解決できるをお勧めします。これらをvimrcに入れてください

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

ギリシャ語をデフォルトとして無効にするには、挿入モードと置換モードで(シンボルではなく、キーにマップ<ctrl>+^することもできます)を使用して、オプションをオン(ギリシャ語)とオフ(英語)で切り替えることができ<ctrl>+6ます(動作しません)ノーマルモード)。挿入モードを終了するときに自動的に無効にするには、使用できます

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

これらの詳細

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


2番目のコメントの編集:

これを試して、挿入モード(および置換モード)に入る場合はギリシャ語を自動的にオンにし、終了する場合は自動的にオフにすることができます(前述のマッピングは不要です)。

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

ポリトニックギリシャ語を使用することは本当に必要ですか?正しいエンコーディングのみが必要であり、組み込みのMacOS X入力を使用する必要があるように思えます。しかし、これはおそらく私の間違った印象です。また、MacOS Xでポリトニックギリシャ語キーボードに切り替えることもできます(学習することはできますが、求めるものではないと思います:-)ἀの遅れについては、マッピング:map >aがあり、でマッピングを解除し:unmap >aます。非ギリシャ語および非MacOのユーザーとして、私はすでに気が狂いました。申し訳ありませんが幸運を祈ります!
龍一郎

10

コメントで述べたように、マッピングはあなたがやりたいことをするように設計されていません。このユースケースの興味深いオプションはlangmapです。

このオプションを使用すると、動作またはキーボードを挿入モードに保ち、他のモードで動作を変更できます。

それを使用するには、Vimをコンパイルする+langmap必要があります。このオプションが有効になっていることを確認できます。echo has('langmap')コマンドが1オプションを有効にする場合は、このオプションを有効にしてセットアップを取得する必要があります(方法を知るには、別の質問です)。

有効にすると、オプションは文字のペアを取ります。たとえば、挿入モードのときにバッファーにset langmap += à@aを追加できますが、通常モードで入力すると実際にトリガーされます(この例はazertyで役立ちますマクロでの作業を容易にするキーボード)。ààà@

ギリシャ語でlangmapを使用するには、次の:h 'langmap'行を追加する例に従ってくださいvimrc (ここからこの行をコピーすることは、エンコードが本当にわからないので、お勧めできません。より安全)

: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

あなたのコメントで私が理解していることから、事前定義されたコマンドを使用しようとすると問題が残ります。コマンドを入力すると、langmap定義の動作の代わりに挿入モードの動作がトリガーされます。残念ながら、そのための良い解決策があるかどうかはわかりません。たとえば、次のようなコマンドを再定義することも考えられます。

command λς lw

この方法でコマンドを入力λςするとlw、Vimは実行されますが、この方法にはいくつかの欠点があります。

  • 使用するすべてのコマンドを再定義することは、大きな苦痛になるかもしれません。
  • ユーザー定義コマンドは大文字で始める必要があり、ギリシャ語でそれを行うのがどれほど便利かを考えました。

したがって、@ Alexander Myshovがこの質問への回答で提案したプラグインが役立つ可能性があります(これらのいずれも試したことがないため、問題を解決できるかどうかはわかりませんが、解決するようです)。


1

英語とスウェーデン語で定期的に入力します。スウェーデン語はギリシャ語よりも小さな問題であり、英語のアルファベットを数文字だけ拡張するためです。しかし、私の解決策はギリシャ語に移行できると思います。

以前は、OSのシステムキーボードスイッチを使用して切り替えました。これに関する問題は、OPが指摘したように、通常モードでは各キーが英語以外のキーボードで別の信号をVimに送信するため、コマンドの束全体が壊れることです。スウェーデンのキーボードレイアウトでは、さらに、非アルファベット文字の全体の束は、新キャラクターのための方法を作るために移動されåäö。たとえば、}Alt-Shift-9(英語キーボードの開き括弧と一致)で入力され、バックスラッシュはAlt-Shift-7で入力されます。したがって、挿入モード用にスウェーデンの標準キーボードレイアウトに切り替えると、頭痛の種が大量に発生します。

私の解決策は、挿入モードのみで関連キーを再マップし、これらのマッピングを関数でラップして、簡単に切り替えられるようにすることでした。以下のコードは私の方法でこれをした方法.vimrcです。これにより、スウェーデン語のキーボードレイアウトでの位置に必要な文字が追加されるだけで、その他はすべて残されます。それらによってマスクされている文字を入力するには(;:[{"、および')、私は単にキーを2回押してください。幸いなことに、愚かな人だけが2を入力する必要がありますä連続して。(このダブルヒットが適切でない場合は、Ctrlまたはそのようなものにマップできます。基本的な原則は、マスクされた文字はキーボード上のその場所に残りますが、1回のキーストロークは認識されません。つまり、スウェーデン語で入力したいときにを<Leader>s押すと、これらのマッピングに切り替わり、スウェーデン語のスペルチェックが適用されます。スイッチバックするには私がやります<Leader>e

さて、ギリシャ語の場合、これにはアルファベット全体のマッピングが含まれますが、実際には原理を理解したように聞こえるほど面倒ではありません。難しいのは、英語に切り替えるときにこれらすべての変更のマッピングを解除することです。おそらく誰かがそれを行う気の利いた方法を思い付くことができます。

私がよく入力する他の言語であるアラビア語に対して、以下のような挿入関数を実行することを計画しています。プロセスについて報告するために、ここに戻ってくるかもしれません。

" 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
私は間違っているかもしれませんが、あなたの答えは挿入モードで英語以外の文字を簡単に取得できると思いますが、OPの問題は挿入モード以外のモードで英語の文字を簡単に取得することでした。あなたの答えが最初の問題を解決するかどうかはわかりません。それでも、マッピングを有効/無効にする機能のアイデアは非常に興味深いものです。
statox

@statoxまあ、私は質問を誤解しているかもしれませんが、問題が通常モードの機能を維持しながら挿入モードで英語以外の文字を簡単に挿入することである場合、私の質問は少なくともその問題に対処しようとしています。
アンドレアス

私は気分を害するつもりはありませんでした:質問とあなたの答えの間にギャップがあるかもしれないことを指摘していましたが、もちろんあなたは問題に対処しようとし、私が言ったように、機能を有効にするというアイデアが本当に好きですマッピングを無効にします。私は本当にあなたの答えを否定していませんでした。
statox

1
@statox違反なし。そして、もしあなたが私の答えを否定したなら、それはすべて順調でしょう。
アンドレアス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.