Tui

Nvim の :help ページ。 生成元は ソース で、 tree-sitter-vimdoc パーサーを使用しています。


ターミナルUI tui
デフォルトでは、nvim を実行する際(--embed または --headless オプションなし)、組み込みの「ターミナルUI」(TUI)が起動します。このデフォルトのUIはオプションです。Nvim を「ヘッドレス」サーバーとして実行したり、GUI を使用したりできます。
Nvim はクライアントサーバーアーキテクチャを採用しています。デフォルトでは、nvim を実行すると、組み込みのUIクライアントが起動し、UIクライアントが接続するnvim --embedサーバー(子プロセス)が開始されます。サーバーに接続した後、UIクライアントは(すべてのUI dev-ui で推奨されているように)nvim_set_client_info() を呼び出し、そのチャネルにこれらのフィールドを設定します。
client = {
  attributes = {
    license = 'Apache 2',
    pid = …,
    website = 'https://neovim.dokyumento.jp',
  },
  name = 'nvim-tui',
  type = 'ui',
  version = { … },
}
Nvim は起動時にターミナルの種類を推測します(--embed および --headless モードを除く)。$TERM 環境変数は、ターミナルの種類を決定する主要なヒントです。
terminfo E557 E558 E559 ユーザーインターフェースを表示するために、Nvim はシステムの terminfo データベース(terminfo が見つからない場合は組み込みのデフォルト)から「ターミナル機能」のリストを読み取ります。その情報が間違っている場合、画面が乱れたり、キーが認識されなかったりする可能性があります。
Unibilium ライブラリ(terminfo の読み取りに使用)を使用すると、"$HOME/.terminfo/" ディレクトリにあるものを用いてシステムの terminfo をオーバーライドできます。独自の terminfo を構築するのは、通常、これを実行するほど簡単です。
curl -LO https://invisible-island.net/datafiles/current/terminfo.src.gz
gunzip terminfo.src.gz
tic -x terminfo.src
$TERM
$TERM 環境変数は、使用しているターミナルと一致する必要があります!一致しないと、Nvim はターミナルが期待するシーケンスを認識できず、奇妙な動作や最適ではない動作(スクロールの異常、色の不正表示など)が発生します。
$TERM は、他のほとんどの環境変数とは異なり、SSH によってリモートセッションに転送されるため、重要です。
For this terminal           Set $TERM to                  |builtin-terms|
-------------------------------------------------------------------------
anything libvte-based       vte, vte-256color                   Y
 (e.g. GNOME Terminal)      (aliases: gnome, gnome-256color)
iTerm (original)            iterm, iTerm.app                    N
iTerm2 (new capabilities)   iterm2, iTerm2.app                  Y
Konsole                     konsole-256color                    N
Linux virtual terminal      linux, linux-256color               Y
PuTTY                       putty, putty-256color               Y
rxvt                        rxvt, rxvt-256color                 Y
screen                      screen, screen-256color             Y
simple terminal (st)        st, st-256color                     Y
Terminal.app                nsterm                              N
tmux                        tmux, tmux-256color                 Y
Windows/ConEmu              conemu                              Y
Windows/Cygwin-built Nvim   cygwin                              Y
Windows/Interix             interix                             Y
Windows/VTP console         vtpcon                              Y
Windows/legacy console      win32con                            Y
xterm or compatible         xterm, xterm-256color               Y
builtin-terms builtin_terms terminfo データベースが利用できない場合、または現在のターミナルのエントリがない場合、Nvim は上記の表に従って $TERM を組み込みのエントリにマップするか、一致がない場合は "ansi" にマップします。「TERM=putty-256color」は組み込みの "putty" エントリにマップされます。tui-colors も参照してください。
組み込みの terminfo は、外部の terminfo データベースと組み合わせることはできませんし、優先して使用することもできません。したがって、エントリを備えた外部の terminfo を提供することで、組み込みの terminfo データベースの省略または古い情報を完全に上書きできます。
ターミナルに依存する設定 term-dependent-settings
ターミナルに依存するオプションまたはマッピングを設定する場合は、init.vim で行うことができます。例
if $TERM =~ '^\(rxvt\|screen\|interix\|putty\)\(-.*\)\?$'
    set notermguicolors
elseif $TERM =~ '^\(tmux\|iterm\|vte\|gnome\)\(-.*\)\?$'
    set termguicolors
elseif $TERM =~ '^\(xterm\)\(-.*\)\?$'
    if $XTERM_VERSION != ''
        set termguicolors
    elseif $KONSOLE_PROFILE_NAME != ''
        set termguicolors
    elseif $VTE_VERSION != ''
        set termguicolors
    else
        set notermguicolors
    endif
elseif $TERM =~ ...
    ... and so forth ...
endif
scroll-region xterm-scroll-region 可能な限り、Nvim はウィンドウがスクロールされたときに高速に再描画するために、ターミナルのスクロール領域を設定する機能を使用します。ターミナルの terminfo 記述が上下のスクロールマージンを設定する機能を記述している場合、それが使用されます。
これは、ターミナルの全幅ではないウィンドウのスクロールを高速化しません。Xterm には、terminfo には記述されていない、左右のスクロールマージンを設定する追加機能があります。Nvim がターミナルが Xterm であることを検出すると、この機能を利用して、ターミナルの全幅ではないスクロールを高速化します。
tui-input
歴史的に、ターミナルエミュレータは、特定のコントロールキー修飾子と他のキーを区別できませんでした。たとえば、<C-I><Tab> は同じように表現され、<Esc><C-[><CR><C-M><NL><C-J> も同様です。
最新のターミナルエミュレータは、コントロール修飾子を異なる方法でエンコードすることにより、これらのキーペアを区別できます。「modifyOtherKeys」と「CSI u」として知られる、2つの一般的な異なる方法があります。Nvim は両方のエンコーディング方法をサポートしており、起動時にターミナルエミュレータにこれらのキーエンコーディングを理解していることを伝えます。ターミナルエミュレータがサポートしている場合、これにより、上記にリストされているキーペアを個別にマッピングできます。<Tab>
Nvim は libtermkey を使用して、ターミナルエスケープシーケンスをキーコードに変換します。terminfo が最初に使用され、terminfo にない CSI シーケンス(拡張キー、別名「modifyOtherKeys」または「CSI u」を含む)も解析できます。
たとえば、tmux で Nvim を実行すると、これにより Nvim は挿入モードを終了し、下のウィンドウに移動します。
tmux send-keys 'Escape' [ 2 7 u 'C-W' j
ここで、'Escape' [ 2 7 u は、<Esc> キーの明確な「CSI u」シーケンスです。
kitty キーボードプロトコル https://sw.kovidgoyal.net/kitty/keyboard-protocol/ は、Unicode プライベート使用領域のキーパッドキーを含む、部分的にサポートされています。たとえば、このシーケンスは Nvim によって <C-kEnter> として認識されます。
CSI 57414 ; 5 u
そして、マッピングでは <C-CR> とは異なる方法で使用できます。
tui-modifyOtherKeys tui-csiu 起動時に Nvim は、次のシーケンスを書き込むことで、ターミナルが「CSI u」エンコーディングをサポートしているかどうかを照会します。
CSI ? u CSI c
ターミナルエミュレータが次のように応答した場合
CSI ? <flags> u
これは、ターミナルが「CSI u」エンコーディングをサポートしており、Nvim が次のシーケンスを書き込むことで有効にすることを意味します。
CSI > 1 u
ターミナルが「CSI u」をサポートしていない場合、Nvim は代わりに次のシーケンスを書き込むことで「modifyOtherKeys」エンコーディングを有効にします。
CSI > 4 ; 2 m
Nvim がクリーンに終了すると、対応するシーケンスが送信され、特別なキーエンコーディングが無効になります。Nvim がクリーンに終了しない場合、ターミナルエミュレータの状態が悪くなる可能性があります。この場合、「reset」を実行するだけです。
tui-colors
Nvim はデフォルトで 256 色を使用し、「linux」(その仮想ターミナルは 4.8 以降から 256 色をサポート)や「xterm」と名乗るものを含む、ほとんどのターミナルタイプについては terminfo を無視します。また、$COLORTERM または $TERM に「256」という文字列が含まれている場合も同様です。
同様に、Nvim は、$COLORTERM を任意の値に設定するターミナルエミュレータは、少なくとも 16 色の動作が可能であると想定します。
true-color xterm-true-color 'termguicolors' が設定されている場合、Nvim はターミナルでトゥルー(24 ビット)カラーを出力します。
これは、「setrgbf」と「setrgbb」の terminfo 拡張機能(2013 年に Rüdiger Sonderfeld によって提案)を使用します。terminfo の定義にそれらが欠けている場合、Nvim は RGB 色の設定のための ISO 8613-6:1994/ITU T.416:1993 コントロールシーケンス(ただし、ターミナルが標準に従うことがわかっている場合を除き、コロンではなくセミコロンを使用するように変更)を使用して、terminfo の定義に追加するかどうかを決定します。
別の規約は、2016 年に tmux によって先駆的に行われた「Tc」terminfo 拡張機能です。terminfo にこのフラグがある場合、Nvim は、terminfo の定義に存在するかのように構築された「setrgbf」と「setrgbb」機能を追加します。
terminfo にこのフラグがない場合、Nvim は $TERM とその他の環境変数に戻ります。「rxvt」、「linux」、「st」、「tmux」、「iterm」ターミナルタイプの場合、または Konsole、本物の Xterm、libvte ターミナルエミュレータバージョン 0.36 以降、または COLORTERM 環境変数を「truecolor」に設定するターミナルエミュレータが検出された場合、構築された「setrgbf」と「setrgbb」機能を追加します。
xterm-resize
Nvim は、dtterm によって先駆的に行われた拡張機能を実装する一部のターミナルで、ターミナルディスプレイのサイズを変更できます。terminfo にはこの拡張機能のフラグがありません。そのため、Nvim は単に「dtterm」、「xterm」、「teraterm」、「rxvt」ターミナルタイプ、および Konsole がすべてこれを実行できると想定しています。
tui-cursor-shape
Nvim は、挿入モードの場合(または 'guicursor' オプションで指定されている場合)、サポートするターミナルでカーソルの形状をブロックから線に変更します。これには、tmux によって先駆的に行われたのと同じ terminfo 拡張機能「Ss」と「Se」を使用します。同様に、blend=100 を使用してカーソル強調表示グループを設定すると、Nvim は「cvvis」と「civis」拡張機能を使用してカーソルを非表示にします。
terminfo の定義にそれらが欠けている場合、Nvim は $TERM とその他の環境変数を確認することで、terminfo の定義に追加するかどうかを決定します。「rxvt」、「putty」、「linux」、「screen」、「teraterm」、「iterm」ターミナルタイプの場合、または Konsole、libvte ベースのターミナルエミュレータ、または本物の Xterm が検出された場合、構築された「Ss」と「Se」機能を追加します。
tui-cursor-tmux
tmux 内では、Nvim がカーソルを変更していないように見えることがありますが、実際には、Nvim からカーソルを変更する指示を受け取っているのは tmux であり、順番に何をするかわからないということです。tmux は、Nvim から受信したものを、ホストターミナルに適したコントロールシーケンスに変換する必要があります。Nvim と同様のメカニズムを共有しており、存在する場合は terminfo(出力ターミナル用)から「Ss」と「Se」機能を使用します。Nvim とは異なり、terminfo にそれらが存在しない場合は、~/.tmux.conf で「terminal-overrides」を設定することで追加する必要があります。
tmux(1) マニュアルページを参照して、tmux 設定ファイルでどのように何を行うかの詳細を確認してください。次のようになります。
set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q'
または(残念ですが!)Konsole 18.07.70 以前の場合、次のような複雑なものになります。
set -ga terminal-overrides 'xterm*:\E]50;CursorShape=%?%p1%{3}%<%t%{0}%e%{1}%;%d\007'

ウィンドウサイズ window-size

[これは、`:split` コマンドで作成されたウィンドウではなく、Vim が使用しているウィンドウ全体のサイズに関するものです。]
Unix システムでは、ウィンドウサイズを取得するために 3 つの方法が試みられます。
ioctl 呼び出し(TIOCGSIZE または TIOCGWINSZ、システムによって異なります)
環境変数「LINES」と「COLUMNS」
terminfo エントリの「lines」と「columns」から
すべてが失敗した場合、デフォルトサイズとして 24 行 80 列が想定されます。ウィンドウサイズ変更シグナルを受信すると、サイズが再設定されます。ウィンドウサイズが間違っている場合は、'lines''columns' オプションを使用して正しい値を設定できます。:mode を参照してください。

低速ターミナルと高速ターミナル slow-fast-terminal

slow-terminal
低速ターミナルを使用している場合は、'showcmd''ruler' オプションをリセットすることを検討してください。コマンド文字とカーソル位置はステータスラインに表示されません(キーを押したり移動したりするたびに、多くのカーソル移動と属性変更が含まれます)。ターミナルのスクロールが非常に遅い場合は、'scrolljump' を 5 程度に設定します。カーソルが画面から移動した場合(たとえば、「j」を使用)、Vim は一度に 5 行スクロールします。別の方法は、「z{height}」コマンドを使用して Vim が使用する行数を減らすことです。
端末からの文字の到着間隔が1秒を超える場合は、'timeout' および/または 'ttimeout' オプションの設定を検討してください。
バッファの末尾を超える行を表示する際に遅いカラー端末を使用している場合、これはNvimが空白を2回、2組の色と属性で描画しているためです。これを回避するには、次のコマンドを使用します。
hi NonText cterm=NONE ctermfg=NONE
これにより、空白がデフォルトの色と属性で描画され、2回目の描画パスを最適化できます。注記:理論的には空白の色は重要ではありませんが、実際にはカーソルや選択範囲の色を変更します。これにより、一部のUIで目に見える、ただし軽微な影響が生じる可能性があります。

マウスの使用 mouse-using

mouse-mode-table mouse-overview 'mousemodel' が "extend" の場合のマウスボタンの機能概要
<S-LeftMouse> <A-RightMouse> <S-RightMouse> <RightDrag> <RightRelease> <LeftDrag> 通常モード
event         position     selection        change  action
               cursor                       window
---------------------------------------------------------------------------
<LeftMouse>     yes          end              yes
<C-LeftMouse>   yes          end              yes    "CTRL-]" (2)
<S-LeftMouse>   yes       no change           yes    "*" (2)
<LeftDrag>      yes     start or extend (1)   no
<LeftRelease>   yes     start or extend (1)   no
<MiddleMouse>   yes       if not active       no     put
<MiddleMouse>   yes       if active           no     yank and put
<RightMouse>    yes     start or extend       yes
<A-RightMouse>  yes start or extend blockw.   yes
<S-RightMouse>  yes        no change          yes    "#" (2)
<C-RightMouse>  no         no change          no     "CTRL-T"
<RightDrag>     yes         extend            no
<RightRelease>  yes         extend            no
挿入または置換モード
event         position     selection        change  action
               cursor                       window
---------------------------------------------------------------------------
<LeftMouse>     yes     (cannot be active)    yes
<C-LeftMouse>   yes     (cannot be active)    yes    "CTRL-O^]" (2)
<S-LeftMouse>   yes     (cannot be active)    yes    "CTRL-O*" (2)
<LeftDrag>      yes     start or extend (1)   no     like CTRL-O (1)
<LeftRelease>   yes     start or extend (1)   no     like CTRL-O (1)
<MiddleMouse>   no      (cannot be active)    no     put register
<RightMouse>    yes     start or extend       yes    like CTRL-O
<A-RightMouse>  yes start or extend blockw.   yes
<S-RightMouse>  yes     (cannot be active)    yes    "CTRL-O#" (2)
<C-RightMouse>  no      (cannot be active)    no     "CTRL-O CTRL-T"
ヘルプウィンドウ内
event         position     selection        change  action
               cursor                       window
---------------------------------------------------------------------------
<2-LeftMouse>   yes     (cannot be active)    no     "^]" (jump to help tag)
'mousemodel' が "popup" の場合、これらは異なります
<A-LeftMouse>
通常モード
event         position     selection        change  action
               cursor                       window
---------------------------------------------------------------------------
<S-LeftMouse>   yes     start or extend (1)   no
<A-LeftMouse>   yes     start/extend blockw   no
<RightMouse>    no      popup menu            no
挿入または置換モード
event         position     selection        change  action
               cursor                       window
---------------------------------------------------------------------------
<S-LeftMouse>   yes     start or extend (1)   no     like CTRL-O (1)
<A-LeftMouse>   yes     start/extend blockw   no
<RightMouse>    no      popup menu            no
(1) マウスポインタが押下後移動した場合のみ (2) クリックが同じバッファ内にある場合のみ
左マウスボタンをクリックすると、カーソルが配置されます。別のウィンドウ内をクリックすると、そのウィンドウがアクティブウィンドウになります。コマンドラインを編集している場合、カーソルはコマンドライン上にのみ配置できます。挿入モードの場合、Vimは挿入モードのままです。'scrolloff' が設定されており、カーソルがウィンドウの境界から'scrolloff'行以内にある場合、テキストがスクロールされます。
最初の文字で左マウスボタンを押して、マウスを最後の文字に移動し、マウスボタンを離すと、選択を開始できます。ボタンを離すまで選択が表示されない場合があり、一部のバージョン(GUI、Win32)ではドラッグがすぐに表示されます。'scrolloff' が0以外の場合、ウィンドウ内の最初の行/最後の行でマウスを少なくとも1文字移動すると、テキストをスクロールできることに注意してください。
通常モード、ビジュアルモード、選択モードで右マウスボタンをクリックすると、ビジュアル領域が拡張されます。'mousemodel' が "popup" の場合、Shiftキーを押しながら左ボタンを使用する必要があります。別のバッファを編集しているウィンドウ内をクリックすると、ビジュアルモードまたは選択モードが停止します。
通常モード、ビジュアルモード、選択モードでAltキーを押しながら右マウスボタンをクリックすると、ビジュアル領域がブロック単位になります。'mousemodel' が "popup" の場合、Altキーを押しながら左ボタンを使用する必要があります。Altキーを押しているときにウィンドウマネージャがマウスイベントを消費するシステムでは機能しないことに注意してください(ウィンドウが移動することがあります)。
double-click <2-LeftMouse> <3-LeftMouse> <4-LeftMouse> GUIがアクティブな場合、Win32の場合、およびxtermの場合、ダブルクリック、トリプルクリック、クアドラプルクリックがサポートされています。テキストを選択する場合、追加のクリックで選択範囲が拡張されます。
click           select
---------------------------------
double          word or % match
triple          line
quadruple       rectangular block
例外:ヘルプウィンドウでは、ダブルクリックするとクリックした単語のヘルプにジャンプします。
単語をダブルクリックすると、その単語が選択されます。'iskeyword' は、単語に含まれる文字を指定するために使用されます。一致する文字をダブルクリックすると、その一致する文字まで選択されます( "v%" を使用する場合と同じ)。一致が #if/#else/#endif ブロックの場合、選択は行単位になります。MS-Windowsとxtermの場合、ダブルクリックの時間は'mousetime'オプションで設定できます。他のシステムでは、この時間はVimの外部で定義されます。例:ダブルクリックを使用してカーソル下のタグにジャンプするには
:map <2-LeftMouse> :exe "tag " .. expand("<cword>")<CR>
ダブルクリック(ボタンを押下、ボタンを離す、ボタンを押下してからドラッグ)でマウスをドラッグすると、単語全体が選択されます。これはボタンを離すまで続き、その時点で選択は文字単位に戻ります。
マウスによるスクロールについては、scroll-mouse-wheelを参照してください。
挿入モードで選択を開始すると、Vimは一時的に通常モードになります。ビジュアルモードまたは選択モードが終了すると、挿入モードに戻ります。これは、挿入モードでCTRL-Oを使用する場合と同じです。'selectmode'オプションに "mouse" が含まれている場合、選択モードが使用されます。
X1Mouse X1Drag X1Release X2Mouse X2Drag X2Release <MiddleRelease> <MiddleDrag> マウスクリックはマッピングできます。マウスクリックのコードは次のとおりです。
    code           mouse button              normal action
---------------------------------------------------------------------------
<LeftMouse>     left pressed               set cursor position
<LeftDrag>      left moved while pressed   extend selection
<LeftRelease>   left released              set selection end
<MiddleMouse>   middle pressed             paste text at cursor position
<MiddleDrag>    middle moved while pressed -
<MiddleRelease> middle released            -
<RightMouse>    right pressed              extend selection
<RightDrag>     right moved while pressed  extend selection
<RightRelease>  right released             set selection end
<X1Mouse>       X1 button pressed          -
<X1Drag>        X1 moved while pressed     -
<X1Release>     X1 button release          -
<X2Mouse>       X2 button pressed          -
<X2Drag>        X2 moved while pressed     -
<X2Release>     X2 button release          -
X1ボタンとX2ボタンは、一部のマウスにある追加ボタンを参照します。「Microsoft Explorer」マウスには、右手の親指で使用できるこれらのボタンがあります。現在、X1とX2はWin32とX11環境でのみ機能します。
:noremap <MiddleMouse> <LeftMouse><MiddleMouse>
中央マウスボタンをクリックした位置にペーストします(それ以外の場合は、カーソル位置にペーストされます)。
:noremap <LeftRelease> <LeftRelease>y
ビジュアルモードを使用する場合、選択をすぐにヤンクします。
再帰的なマッピングを回避するために "map" ではなく ":noremap" を使用することに注意してください。
:map <X1Mouse> <C-O>
:map <X2Mouse> <C-I>
X1ボタンとX2ボタンをジャンプリストの前後移動にマッピングします。CTRL-OCTRL-Iを参照してください。
mouse-swap-buttons
左マウスボタンと右マウスボタンの意味を入れ替えるには
:noremap        <LeftMouse>     <RightMouse>
:noremap        <LeftDrag>      <RightDrag>
:noremap        <LeftRelease>   <RightRelease>
:noremap        <RightMouse>    <LeftMouse>
:noremap        <RightDrag>     <LeftDrag>
:noremap        <RightRelease>  <LeftRelease>
:noremap        g<LeftMouse>    <C-RightMouse>
:noremap        g<RightMouse>   <C-LeftMouse>
:noremap!       <LeftMouse>     <RightMouse>
:noremap!       <LeftDrag>      <RightDrag>
:noremap!       <LeftRelease>   <RightRelease>
:noremap!       <RightMouse>    <LeftMouse>
:noremap!       <RightDrag>     <LeftDrag>
:noremap!       <RightRelease>  <LeftRelease>
メイン
コマンドインデックス
クイックリファレンス