|
1 |
| -*map.txt* For Vim バージョン 8.2. Last change: 2020 Apr 23 |
| 1 | +*map.txt* For Vim バージョン 8.2. Last change: 2020 Sep 06 |
2 | 2 |
|
3 | 3 |
|
4 | 4 | VIMリファレンスマニュアル by Bram Moolenaar
|
|
188 | 188 | 引数に <nowait> を追加します。そしてそのマップは一致する場合に使用され、Vimは
|
189 | 189 | それ以上入力される文字を待ちません。しかし、既に文字が入力されていた場合はそれ
|
190 | 190 | が使われます。
|
| 191 | +Note: これが動作するのは <nowait> なマッピングが完全にマッチし、なんらかの部分 |
| 192 | +マッチの前に見付かるときです。これが動作するのは: |
| 193 | +- バッファローカルなマッピングで唯一のマッチがあるとき。なぜなら常にグローバル |
| 194 | + なマッピングより先に見付かるからです。 |
| 195 | +- これとは別のバッファローカルなマッピングが部分マッチするが、より早く定義され |
| 196 | + ているとき (最後に定義したマッピングが最初に見付かる)。 |
191 | 197 |
|
192 | 198 | *:map-<silent>* *:map-silent*
|
193 | 199 | 実行するコマンドがコマンドラインに表示されないようにするには、マップコマンドの
|
@@ -275,16 +281,8 @@ getchar() によって取得され、返されます。
|
275 | 281 | CTRL-L で次の番号を挿入し、CTRL-R で番号をリセットします。CTRL-R は空文字列を
|
276 | 282 | 返すので、何も挿入されません。
|
277 | 283 |
|
278 |
| -Note: 特殊キーが機能するようにしたり、テキスト中の CSI バイトをエスケープした |
279 |
| -りするために、特別な処理が行われています。|:map| コマンドも同様の処理を行うの |
280 |
| -で、それが二重に実行されるのを防ぐ必要があります。次のものは機能しません: > |
281 |
| - :imap <expr> <F3> "<Char-0x611B>" |
282 |
| -なぜなら、<Char- で表記した文字 (あるいは本物の文字) のバイト列は |:imap| コマ |
283 |
| -ンドが解釈されるときにエスケープされ、<expr> で使われるときにもう一度エスケー |
284 |
| -プされるからです。次のものは機能します: > |
285 |
| - :imap <expr> <F3> "\u611B" |
286 |
| -テキストの末尾以外で 0x80 をシングルバイトとして使った場合、それは機能しませ |
287 |
| -ん。特殊キーとして認識されます。 |
| 284 | +Note: テキストの末尾以外で 0x80 をシングルバイトとして使った場合、それは機能し |
| 285 | +ません。特殊キーとして認識されます。 |
288 | 286 |
|
289 | 287 |
|
290 | 288 | 1.3 マップとモード *:map-modes*
|
@@ -864,34 +862,46 @@ g@{motion} 'operatorfunc' に設定された関数を実行します。
|
864 | 862 |
|
865 | 863 | 例を示します。これは <F4> を使ってスペースの数を数えます: >
|
866 | 864 |
|
867 |
| - nmap <silent> <F4> :set opfunc=CountSpaces<CR>g@ |
868 |
| - vmap <silent> <F4> :<C-U>call CountSpaces(visualmode(), 1)<CR> |
| 865 | + nnoremap <expr> <F4> CountSpaces() |
| 866 | + xnoremap <expr> <F4> CountSpaces() |
| 867 | + " <F4> 2回で行に作用 |
| 868 | + nnoremap <expr> <F4><F4> CountSpaces() .. '_' |
869 | 869 |
|
870 |
| - function! CountSpaces(type, ...) |
871 |
| - let sel_save = &selection |
872 |
| - let &selection = "inclusive" |
873 |
| - let reg_save = @@ |
874 |
| -
|
875 |
| - if a:0 " ビジュアルモードから呼び出すのに、gv コマンドを使用します。 |
876 |
| - silent exe "normal! gvy" |
877 |
| - elseif a:type == 'line' |
878 |
| - silent exe "normal! '[V']y" |
879 |
| - else |
880 |
| - silent exe "normal! `[v`]y" |
| 870 | + function CountSpaces(type = '') abort |
| 871 | + if a:type == '' |
| 872 | + set opfunc=CountSpaces |
| 873 | + return 'g@' |
881 | 874 | endif
|
882 | 875 |
|
883 |
| - echomsg strlen(substitute(@@, '[^ ]', '', 'g')) |
884 |
| -
|
885 |
| - let &selection = sel_save |
886 |
| - let @@ = reg_save |
| 876 | + let sel_save = &selection |
| 877 | + let reg_save = getreginfo('"') |
| 878 | + let cb_save = &clipboard |
| 879 | + let visual_marks_save = [getpos("'<"), getpos("'>")] |
| 880 | +
|
| 881 | + try |
| 882 | + set clipboard= selection=inclusive |
| 883 | + let commands = #{line: "'[V']y", char: "`[v`]y", block: "`[\<c-v>`]y"} |
| 884 | + silent exe 'noautocmd keepjumps normal! ' .. get(commands, a:type, '') |
| 885 | + echom getreg('"')->count(' ') |
| 886 | + finally |
| 887 | + call setreg('"', reg_save) |
| 888 | + call setpos("'<", visual_marks_save[0]) |
| 889 | + call setpos("'>", visual_marks_save[1]) |
| 890 | + let &clipboard = cb_save |
| 891 | + let &selection = sel_save |
| 892 | + endtry |
887 | 893 | endfunction
|
888 | 894 |
|
| 895 | +<expr> のマッピングを使うことでなんらかのカウントかレジスタの接頭詞を取ること |
| 896 | +が可能になります。それにより、CmdlineEnter と CmdlineLeave の自動コマンドをト |
| 897 | +リガーするコマンドラインの使用も回避します。 |
| 898 | + |
889 | 899 | Note: 一時的に 'selection' を "inclusive" に設定し、'[ から '] まで選択した範
|
890 | 900 | 囲を正しくヤンクできるようにしています。
|
891 | 901 |
|
892 |
| -Note: ビジュアルモードのために別のマップを定義しています。ビジュアルモードで |
893 |
| -":" を押した場合に挿入される "'<,'>" を削除し、関数に visualmode() の値と追加 |
894 |
| -の引数を渡しています。 |
| 902 | +Note: 'clipboard' オプションの値に `unnamed` か `unnamedplus` が含まれている場 |
| 903 | +合、レジスタの `"*` や `"+` が上書きされることを防ぐため、一時的に空に設定され |
| 904 | +ます。 |
895 | 905 |
|
896 | 906 | ==============================================================================
|
897 | 907 | 2. 短縮入力 (Abbreviations) *abbreviations* *Abbreviations*
|
@@ -1152,6 +1162,10 @@ non-id マッチした場所の前がスペース、タブ、行頭、挿入
|
1152 | 1162 | 行されます。そのコマンドからローカル関数を呼び出したり、ローカルマップを使用す
|
1153 | 1163 | ることができます。
|
1154 | 1164 |
|
| 1165 | +<SID> が正しく展開されないコンテキストで値が使われる場合は、expand() 関数を使 |
| 1166 | +います: > |
| 1167 | + let &includexpr = expand('<SID>') .. 'My_includeexpr()' |
| 1168 | +
|
1155 | 1169 | スクリプト以外の場所で "<SID>" を使うとエラーになります。
|
1156 | 1170 |
|
1157 | 1171 | 複雑な処理をするスクリプトで、スクリプト番号が必要な場合は、次の関数で番号を得
|
|
0 commit comments