備忘録的なもの

Neovim でマウス操作を無効にする

タイトル通り。

Neovim を使っているので一応このタイトルにしているが、特に Vim との違いとかって意図は無い。

自分は Linux でエディタとして Neovim 、デスクトップ環境として Xfce を使っているのだが、 フォーカスを切り替えるときにウィンドウ内の適当な場所をクリックして切り替えることが多い。

で、ブラウザで何かを調べながら、ターミナル( Neovim )で文章書いてたり設定ファイル弄るみたいなこともよくやっているが、 ターミナルをクリックしたときにカーソル位置がずれるのが結構ストレスになっていたので無効化した。

設定自体は1行なのだが、その1行を理解するために調べたこと。

設定作業

ググれば記事は色々ヒットするが、実際やることとしてはそれらと同じで以下を設定ファイル( .config/nvim/init.vim なり .vimrc なり)に足すだけ。

set mouse=

関連して調べたこと

mouse について

そもそもの mouse オプションについて。

mouse が何をしているオプションかというところから知らなかったので、ひとまず :help mouse を確認。

'mouse'                 string  (default "nvi")
                        global

        Enables mouse support. For example, to enable the mouse in Normal mode
        and Visual mode:
                :set mouse=nv

        To temporarily disable mouse support, hold the shift key while using
        the mouse.

        Mouse support can be enabled for different modes:
                n       Normal mode
                v       Visual mode
                i       Insert mode
                c       Command-line mode                
                h       all previous modes when editing a help file
                a       all previous modes
                r       for hit-enter and more-prompt prompt

        Left-click anywhere in a text buffer to place the cursor there.  This
        works with operators too, e.g. type d then left-click to delete text
        from the current cursor position to the position where you clicked.

        Drag the status-line or vertical separator of a window to resize it.

        If enabled for "v" (Visual mode) then double-click selects word-wise,
        triple-click makes it line-wise, and quadruple-click makes it
        rectangular block-wise.

        For scrolling with a mouse wheel see scroll-mouse-wheel.

        Note: When enabling the mouse in a terminal, copy/paste will use the
        "* register if possible. See also 'clipboard'.

        Related options:
        'mousefocus'    window focus follows mouse pointer
        'mousemodel'    what mouse button does which action
        'mousehide'     hide mouse pointer while typing text
        'selectmode'    whether to start Select mode or Visual mode

        The :behave command provides some "profiles" for mouse behavior.
                                                                :behave :be
        :be[have] {model}       Set behavior for mouse and selection.  Valid
                                arguments are:
                                   mswin        MS-Windows behavior
                                   xterm        Xterm behavior

                                Using ":behave" changes these options:
                                option          mswin                   xterm
                                'selectmode'    "mouse,key"             ""
                                'mousemodel'    "popup"                 "extend"
                                'keymodel'      "startsel,stopsel"      ""
                                'selection'     "exclusive"             "inclusive"

ということで、マウス操作を有効化するモードを指定するオプションだった。

(自分の環境だと)デフォルトが mouse=nvi になっているところを、mouse= (有効化するモード無し)とすることで、マウス操作を全モードで無効化する形。

ちなみに mouse= として全モードでマウス操作を無効化していても、ホイールスクロールは有効なままだった。 マウスを使った操作全般というよりは、ウィンドウ内のカーソル座標を使うイベントが mouse オプションでの有効無効の対象になっている感じだろうか。 ホイールスクロールについては特に困ってなかったので、それ以上は追わずそのままにしている。

余談だが、このヘルプ読んで Shirt キーとのコンビネーションで一時的に無効化できるということを初めて知った。

mouse-=a について

マウスの無効化の方法について調べていると、 set mouse-=a としている記事もいくつかあった。

mouse オプションでの指定から全てのモードを削除する、 と雰囲気で解釈した( chmod a-x とかでの - と似たような感じ)のだが、自分の環境ではこれだと無効化されなかった。

-= の理解が間違っているのかと思い一応 :help set を見ると以下の感じ。

:se[t] {option}-={value}                                :set-=
                        Subtract the {value} from a number option, or remove
                        the {value} from a string option, if it is there.     
                        If the {value} is not found in a string option, there
                        is no error or warning.  When the option is a comma-
                        separated list, a comma is deleted, unless the option
                        becomes empty.                               
                        When the option is a list of flags, {value} must be
                        exactly as they appear in the option.  Remove flags
                        one by one to avoid problems.               
                        Also see :set-args above.

オプションの種類によって動きが違うが、以下のような処理をする演算子。

  • オプションが数値
    • 与えられた数値分減算する
  • オプションが文字列
    • 与えられた文字列が含まれている場合はそれを削除する
    • 文字列がフラグのリストになっている場合は値の中に現れている通り正確に指定すること

デフォルトで mouse=nvi となっているところから、 mouse-=a で削除しようとしても a が値に含まれていないので mouse=nvi から変わらない。 ( a を全モードとして解釈してフラグを落としたりはしない) ということで効かなかったらしい。

Neovim(Vim) のバージョンなのか使っているパッケージ(ディストリビューション)の設定なのかは分からないが、 場合によってはデフォルト値が mouse=a になっていて、その場合の記事だったのかもしれない。