vim-jp / vimdoc-ja / usr_42

usr_42 - Vimドキュメント

メインヘルプファイルに戻る
usr_42.txt    For Vim バージョン 8.2.  Last change: 2008 May 05

                     VIM USER MANUAL - by Bram Moolenaar

                           新しいメニューを追加する


Vim の柔軟性については既にご存知だと思います。それは GUI のメニューにおいても
同じです。自分でメニューを追加して、コマンドの実行を簡単にすることができます。
この章はマウスをよく使うユーザー向けです。

42.1  はじめに
42.2  メニューコマンド
42.3  その他いろいろ
42.4  ツールバーとポップアップメニュー

次章: usr_43.txt  ファイルタイプを使う
前章: usr_41.txt  Vim script 書法
目次: usr_toc.txt

==============================================================================
42.1  はじめに

Vim のメニューは "$VIMRUNTIME/menu.vim" で定義されています。自分のメニューを作
りたい場合は、そのファイルにざっと目を通してみてください。
メニューを定義するには ":menu" コマンドを使います。基本的な書式は次のとおり:

        :menu {menu-item} {keys}

{menu-item} にはメニューの場所を指定します。例えば {menu-item} が "File.Save"
なら、"File" メニューの下の "Save" 項目を示します。ドットで名前を区切ります。
例:

        :menu File.Save  :update<CR>

":update" コマンドは、ファイルが変更されていればそれを保存するコマンドです。
階層を深くすることもできます。"Edit.Settings.Shiftwidth" なら、"Edit" メニュー
の下の "Settings" サブメニューの下の "Shiftwidth" 項目を示します。さらに深くす
ることもできます。メニューが深くなりすぎるとマウスをたくさん動かさなければなら
なくなるので注意してください。
":menu" コマンドは ":map" コマンドとよく似ています。パラーメーターの左側でコマ
ンドの実行方法を指定し、右側で実行されるコマンドを指定します。{keys} は文字列
で、それが実際に入力されたかのように使われます。つまり、挿入モードでは {keys}
の文字列がそのまま挿入されます。


キーボードアクセラレータ
------------------------

アンパサンド文字 (&) はアクセラレータを示すために使われます。例えば、Alt-F で
"File" を選択し、そして S で "Save" を選択できます。 ('winaltkeys' オプション
の設定によって無効になっている可能性もあります)。その場合、{menu-item} は
"&File.&Save" のようになります。アクセラレータ文字は下線付きで表示されます
それぞれのキーは各メニューの中で一度だけしか使わないようにしてください。そうし
ないと、どちらが実行されるのかわからなくなります。これについて Vim は警告は発
しません。


並び順
------

"File.Save" メニューの実際の定義は次のようになっています:

        :menu 10.340 &File.&Save<Tab>:w  :confirm w<CR>

10.340 という数値は順位番号です。これはメニュー項目の位置を決定するために使わ
れます。最初の番号 (10) はメニューバーにおける位置を示します。数字が小さいほど
左側に配置され、大きいほど右側に配置されます。
標準メニューでは次の順位番号が使われています:

        日本語環境
          10       20     40       50         60       70            9999
        +-----------------------------------------------------------------+
        | ファイル 編集 ツール シンタックス バッファ ウィンドウ    ヘルプ |
        +-----------------------------------------------------------------+

        英語環境
          10    20     40     50      60       70               9999
        +------------------------------------------------------------+
        | File  Edit  Tools  Syntax  Buffers  Window            Help |
        +------------------------------------------------------------+

ヘルプメニューには大きな番号が与えられ、右端に表示されるようになっています。
二番目の数字 (340) はプルダウンメニューにおける位置を示します。数字が小さいほ
ど上に配置され、大きいほど下に配置されます。ファイルメニューの順位番号を以下に
示します:

                            日本語環境                英語環境
                        +-------------------+    +-----------------+
            10.310      |開く...            |    |Open...          |
            10.320      |分割して開く...    |    |Split-Open...    |
            10.325      |新規作成           |    |New              |
            10.330      |閉じる             |    |Close            |
            10.335      |------------------ |    |---------------- |
            10.340      |保存               |    |Save             |
            10.350      |名前を付けて保存...|    |Save As...       |
            10.400      |------------------ |    |---------------- |
            10.410      |差分表示...        |    |Split Diff with  |
            10.420      |パッチ結果を表示...|    |Split Patched By |
            10.500      |------------------ |    |---------------- |
            10.510      |印刷               |    |Print            |
            10.600      |------------------ |    |---------------- |
            10.610      |保存して終了       |    |Save-Exit        |
            10.620      |終了               |    |Exit             |
                        +-------------------+    +-----------------+

それぞれの番号の間には少し余裕があるので、必要なら、そこにメニューを追加するこ
とができます (ただし、標準メニューに手を加えるより、新しいメニューを追加したほ
うがよいでしょう)。
サブメニューを作るときは、さらに ".number" を追加することができます。つまり、
{menu-item} のそれぞれの名前が順位番号を持ちます。


特殊文字
--------

例では、{menu-item} に "&File.&Save<Tab>:w" が指定されていました。これは重要な
ポイントです。{menu-item} は一つの単語でなければなりません。ドット、スペース、
タブなどを使いたい場合は <> 表記 (<Space><Tab>など) を使うか、バックスラッ
シュ (\) でエスケープする必要があります。

        :menu 10.305 &File.&Do\ It\.\.\. :exit<CR>

これは、メニュー項目の名前が "Do It..." (空白が含まれてます)、実行されるコマン
ドは ":exit<CR>" になります。

メニューの名前は <Tab> 文字を使って、名前の部分とヒント情報の部分を区切ること
ができます。<Tab> より後ろの部分は右寄せされて表示されます。File.Save では
"&File.&Save<Tab>:w" という名前が使われていました。これは "File.Save" という名
前と ":w" というヒント情報です。


セパレータ
----------

セパレータは、関連した項目をグループ化するのに使います。これは例えば "-sep-"
のように名前の最初と最後に "-" を付けることで定義できます。複数のセパレータを
使う場合はそれぞれ別の名前を付けてください。名前自体に意味はありません。
セパレータに設定されたコマンドが実行されることはありませんが、その定義は必要で
す。":" を書いておいてください。例:

        :amenu 20.510 Edit.-sep3- :

==============================================================================
42.2  メニューコマンド

メニューはモード別に定義できます。メニュー項目は対応するモードでのみ使えます。
":map" コマンドのバリエーションと同じようなものです:

        :menu           ノーマルモード、ビジュアルモード、オペレータ待機モード
        :nmenu          ノーマルモード
        :vmenu          ビジュアルモード
        :omenu          オペレータ待機モード
        :menu!          挿入モード、コマンドライン
        :imenu          挿入モード
        :cmenu          コマンドラインモード
        :tlmenu         端末モード
        :amenu          すべてのモード (端末モードを除く)

メニュー項目が再マップされないようにするには、":noremenu"、":nnoremenu"、
":anoremenu" などを使います。


:amenu の使い方
---------------

":amenu" コマンドは少し特殊です。{keys} に指定した文字列はノーマルモードで実行
するものとして扱われます。ビジュアルモードや挿入モードでメニューが使われた場合
は、実行の前にノーマルモードに戻らなければならないので、CTRL-C や CTRL-O が挿
入されます。例えば、次のコマンドを使うと:

        :amenu  90.100 Mine.Find\ Word  *

メニューのコマンドは次のように定義されます:

        ノーマルモード:         *
        ビジュアルモード:       CTRL-C *
        オペレータ待機モード:   CTRL-C *
        挿入モード:             CTRL-O *
        コマンドラインモード:   CTRL-C *

コマンドラインモードでは、入力途中のコマンドが CTRL-C によって破棄されます。ビ
ジュアルモードとオペレータ待機モードでは、CTRL-C によってモードが停止します。
挿入モードでは、CTRL-O を使ってコマンドを実行してから挿入モードに戻ります。
CTRL-O は一つのコマンドに対してのみ機能します。複数のコマンドを実行したい場合
は、それらを関数に入れて、その関数を呼んでください。例:

        :amenu  Mine.Next\ File  :call <SID>NextFile()<CR>
        :function <SID>NextFile()
        :  next
        :  1/^Code
        :endfunction

このメニュー項目は、":next" で引数リストの次のファイルに移動し、"Code" で始ま
る行を検索します。
関数名の前にある <SID> はスクリプトIDです。関数がスクリプトの中に限定されるよ
うになります。複数のスクリプトファイルで関数の名前が重複してしまう問題を避ける
ことができます。<SID> 参照。


サイレントメニュー
------------------

メニューは {keys} を実際に入力したかのように実行されます。":" コマンドであれば
コマンドラインにエコーされたコマンドが表示されます。そのコマンドが長ければ、
hit-Enter プロンプトが表示されます。そんなのはうっとうしいですよね。
これはメニューをサイレントにすることで解決できます。それには <silent> 引数を指
定します。例えば、上の例の NextFile() を呼び出してみます。メニューを実行する
と、コマンドラインには次のような表示がでます:

        :call <SNR>34_NextFile()

このような表示をなくすには、最初の引数として "<silent>" を指定します:

        :amenu <silent> Mine.Next\ File :call <SID>NextFile()<CR>

"<silent>" の使いすぎに注意してください。コマンドが短いならそれは必要ありませ
ん。誰かのためにメニューを作る場合、実行されたコマンドが見えるようになっていれ
ば、マウスを使わない場合はどのように入力すればいいかのヒントになります。


メニューの一覧
--------------

{keys} を指定せずに menu コマンドを使うと、定義されたメニューの一覧を表示でき
ます。{menu-item} やその一部を指定することで、特定の項目だけを表示できます。
例:

        :amenu

すべてのメニューが表示されます。とっても長い一覧が表示されます。メニューの名前
を指定して短い一覧を表示したほうがいいでしょう:

        :amenu Edit
        :amenu 編集(E)

すべてのモードの "Edit" メニューの項目だけが表示されます。挿入モードのメニュー
項目を一つだけ表示するには次のようにします:

        :imenu Edit.Undo
        :imenu 編集(E).取り消す(U)

名前は正しく指定する必要があります。大文字と小文字は区別されます。ただし、アク
セラレータ指定のための '&' は省略できます。<Tab> と、その後に続く文字列も同様
に省略できます。


メニューの削除
--------------

メニューを削除するには一覧表示と同じようなコマンドを使います。ただし、"menu"
ではなく "unmenu" を使います。":menu" は ":unmenu" になり、":nmenu" は
":nunmenu" になります。挿入モードの "Tools.Make" を削除するには次のようにしま
す:

        :iunmenu Tools.Make
        :iunmenu ツール(T).メイク(M)

メニューの名前を指定すると、その中の項目もすべて削除されます。例:

        :aunmenu Syntax
        :aunmenu シンタックス(S)

シンタックスメニューとその中の項目がすべて削除されます。

==============================================================================
42.3  その他いろいろ

'guioptions' のフラグを設定することでメニューの表示を変更できます。初期設定で
は以下の "M" 以外のすべてのフラグが設定されています。フラグは次のようなコマン
ドで外すことができます:

        :set guioptions-=m

        m               外すとメニューバーが非表示になります。

        M               追加すると標準メニューがロードされなくなります。

        g               外すと非アクティブなメニュー項目は灰色表示にはならず非
                        表示になります。(そうならないシステムもあります。)

        t               外すとティアオフ機能が無効になります。

メニューの一番上に表示される点線はセパレータではありません。その項目を選択する
と、メニューは "ティアオフ(切り離し)"、つまり別ウィンドウで表示されます。これ
をティアオフメニューと呼びます。同じメニュー項目を頻繁に使う場合に便利です。

メニュー項目の翻訳については :menutrans を参照してください。

メニューはマウスで選択するものなので、":browse" コマンドを使って、ファイルを選
択できるようにすると便利です。また、":confirm" を使って、エラーメッセージの代
わりにダイアログを表示するのもいいでしょう (例えばカレントバッファに変更がある
状態で何かをする場合など)。この二つのコマンドは同時に使用できます:

        :amenu File.Open  :browse confirm edit<CR>

":browse" を使うと、開くファイルを選択するためのファイルブラウザーが表示されま
す。":confirm" を使うと、カレントバッファに変更があった場合にポップアップダイ
アログが表示され、それを保存するか、破棄するか、コマンドをキャンセルするかを選
択できます。
confirm() 関数や inputdialog() 関数を使ってもっと複雑な処理をすることもできま
す。標準メニューにいくつか例があります。

==============================================================================
42.4  ツールバーとポップアップメニュー

特殊なメニューが二つあります。ToolBar (ツールバー) と PopUp (ポップアップ) で
す。これらの名前で始まるメニュー項目はメニューバーに表示されません。


ツールバー
----------

ツールバーは 'guioptions' オプションに "T" フラグが含まれている場合のみ表示さ
れます。
ツールバーではテキストの代わりにアイコンが表示されます。例えば、"ToolBar.New"
という {menu-item} はツールバーの "New" アイコンとして表示されます。
Vim には 28 個のアイコンが組み込まれています。その一覧は builtin-tools にあ
ります。ほとんどのアイコンは標準ツールバーで使われています。それらの項目の動作
は変更可能です (標準メニューの初期化後に変更できます)。
標準アイコン以外の画像を使ったり、新しい項目を追加することもできます。例えば、
次のコマンドで新しい項目を追加できます:

        :tmenu ToolBar.Compile  Compile the current file
        :amenu ToolBar.Compile  :!cc %:S -o %:r:S<CR>

アイコンは別途作成する必要があります。MS-Windows では "Compile.bmp" という名前
の bitmap 形式の画像を使います。Unix では "Compile.xpm" という名前の XPM 形式
の画像を使います。サイズは 18x18 ドットにしてください。MS-Windows では他のサイ
ズでも構いませんが、きれいには表示されません。
画像は、'runtimepath' の "bitmaps" ディレクトリに入れてください。例えば、Unix
なら "~/.vim/bitmaps/Compile.xpm" などです。

ツールバーの各項目にはツールチップを設定できます。ツールチップとは、機能を説明
するための短いテキストです。例えば "ファイルを開く" といったものです。項目の上
にマウスポインタを置いてしばらく待つと表示されます。画像だけではどのような機能
かわからない場合に便利です。
例:

        :tmenu ToolBar.Make  Run make in the current directory

        Note:
        大文字/小文字に注意してください。"Toolbar" と "toolbar" はどちらも
        "ToolBar" とは区別されます。

ツールチップを削除するには :tunmenu コマンドを使います。

'toolbar' オプションを設定すると、画像の代わりに文字列を表示したり、文字列と画
像の両方を表示したりできます。テキストの表示は場所を取るので、ほとんどの人は画
像だけを表示しています。


ポップアップメニュー
--------------------

ポップアップメニューはマウスポインタのある場所に表示されるメニューです。
MS-Windows ではマウスの右クリックで表示し、左クリックで項目を選択します。Unix
では右ボタンを押したままにして使います。
ポップアップメニューは 'mousemodel' が "popup" か "popup_setpos" のどちらかに
設定されている場合にだけ表示されます。両者の違いは、"popup_setpos" ならマウス
ポインタの場所にカーソルが移動するという点です。選択中のテキストをクリックした
場合はその選択範囲は変更されずにそのまま使われます。テキストの選択中に他の場所
をクリックした場合は選択が解除されます。
ポップアップメニューはモード別になっています。普通のメニューのように、他のモー
ドの項目が灰色表示されるということはありません。

生命、宇宙、その他もろもろの答えは?  42
この問の真意を知っていた唯一の人物、ダグラス・アダムズは残念ながら他界しまし
た。それで死の答えはなんなんだろう...

==============================================================================

次章: usr_43.txt  ファイルタイプを使う

Copyright: see manual-copyright  vim:tw=78:ts=8:noet:ft=help:norl:
関連キーワード:  メニュー, usr, 表示, コマンド, モード, menu, 名前, File, 実行, Vim