別のキーマップで疑似挿入モードを作成するにはどうすればよいですか?


9

私は2つの異なるキーボードレイアウトを定期的に使用する(Programmers-DvorakTurkish-F)、少し変わった位置にいます。これらのレイアウトはお互いにかなり異なり、私は1組の筋肉の記憶でvimに習熟することができるだけです。私はDvorakレイアウトのvimコマンドにはかなり熟練していますが、キーボードがトルコ語Fレイアウトの場合は、ほとんど使用できません。残念ながら、私は定期的に英語とトルコ語の両方、さらには混合言語でファイルを編集しています。私の能力は、それぞれのキーボードレイアウトでどちらかの言語をうまく入力できるほどですが、私の脳はそれらをクロスワイヤして、Dvorakレイアウトからトルコ語で単語を数文字入力することを拒否します。

Xorgのレイアウトを変更するための2つのキーと敬礼のバインディングがありますが、混合言語ファイルを編集する場合、vimで厄介なワークフローが残ります。

<vim commands…>i<switch to tr>…content…<escape><switch to en><vim commands…>

これを次のように短縮できるようにしたいと思います。

<vim commands…><leader>i…content…<escape><vim commands…>

...を使用すると、システムのキーボードレイアウトを変更せずにトルコ語のレイアウトをエミュレートするために<leader>i一連の:imap値が設定されます。同時に、i追加モードなしで挿入モードに切り替わり:imapます。値自体は簡単です。次のようなアルファベットのマッピングが必要です。

:imap a u
:imap A U
:imap o i
:imap O İ
"etc.

質問ですが、どのようにセットアップ2つのインサートモードへ、マッピングの束を除いて同一である、そしてどのように私はこれらのモードトリガすることができます1つのノーマル挿入モードとモードのインサート1つの擬似<leader>i<leader>aなど?


1
ここに別のアイデアがあります。レイアウトを自動的に切り替えるために使用できるInsertEnterInsertLeaveautocmdがあります。具体的には、InsertLeaveトルコ語であるかどうかを確認し、トルコ語である場合は、Dvorakに切り替えてフラグを設定し、挿入モードに戻ったときに、挿入モードに戻ったときに再度トルコ語に切り替えます。
Martin Tournoij、2015

@Carpetsmokerそれが私の問題をどのように修正するかわかりません。「チェックする」ことがあったとしても(そこをチェックするのかどうかわからない...問題の一部は単語単位で前後に移動することです)、理由の1つの線に沿って考えていたの:imapは、それがリモートのsshセッションでも、$DISPLAYそうでなければ設定されていない場合でも機能するということです。
カレブ2015

回答:


7

Vimには、キーマップの形式でこのようなものがあります。から:help mbyte-keymap

When the keyboard doesn't produce the characters you want to enter in your
text, you can use the 'keymap' option.  This will translate one or more
(English) characters to another (non-English) character.  This only happens
when typing text, not when typing Vim commands.  This avoids having to switch
between two keyboard settings.

挿入モードのみのCaps Lockでは、Caps Lockのエミュレーションのためのこのようなマッピングについて説明しています。ご覧のとおり、mappingsファイルは質問で概説したものと似ています。

この設定は、:set iminsert=1またはを介して動的に有効にしi_CTRL-^ます。それはまたのために働く/search'imsearch'オプション。


3

インゴカーカットの答えは、まさに正しい解決策のようであり、私の状況を解決しました。ただし、vimの言語マップ関数を使い始めたばかりの人のための、もう少し詳しい説明があります。

まず、言語マップファイルが必要です。Caps Lockの例のように、~/.vim/keymap/dvorak2turkishf.vimGithu b から私の完全なマッピングをダウンロードして)次のようなものを挿入する必要があります。

let b:keymap_name = "dvorak2turkishf"
loadkeymap
; f
, g
. ğ
p ı
y o
f d
g r
" etc...

それが適切に設定されていれば、バインディングをセットアップしてアクティブ化する場合とそうでない場合があります。~/.vimrcファイルに何かを追加する必要があります。

まず、検索キーマップを入力キーマップにバインドします。

set imsearch=-1

次に、代替言語入力モードで使用するキーマップを設定します。

set keymap=dvorak2turkishf

デフォルトで変更がないように、代替入力モードをオフにします。

set iminsert=0

挿入モードを終了するたびに実行する自動コマンドを設定して、代替言語スイッチをオフにします。

autocmd InsertLeave * set iminsert=0

最終的に代替言語入力モードになる可能性のあるさまざまな方法すべてにバインディングを追加して、切り替え前に<leader>(通常\)を使用して言語マップswtichをオンに設定するようにします。

nnoremap <leader>i :set iminsert=1<Cr>i
nnoremap <leader>I :set iminsert=1<Cr>I
nnoremap <leader>a :set iminsert=1<Cr>a
nnoremap <leader>A :set iminsert=1<Cr>A
nnoremap <leader>c :set iminsert=1<Cr>c
nnoremap <leader>C :set iminsert=1<Cr>C
nnoremap <leader>r :set iminsert=1<Cr>r
nnoremap <leader>R :set iminsert=1<Cr>R
nnoremap <leader>o :set iminsert=1<Cr>o
nnoremap <leader>O :set iminsert=1<Cr>O

マップが有効な場合の別のカーソル色を設定します。

:highlight Cursor guifg=NONE guibg=Green
:highlight lCursor guifg=NONE guibg=Cyan

まとめると、これが私の設定で変更されたものです。最後に、挿入モードの場合は、を使用して言語マップオプションのオンとオフを切り替えることができます<ctrl>+^

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