挿入/通常モードでVimカーソルを変更するにはどうすればよいですか?


106

可能であれば、現在のモードに応じてVimのカーソルを(色、形などで)変更する方法を教えてください。

私は挿入モードではないことを常に忘れ、コードを入力し始めます。その結果、あらゆる種類のクレイジーなことが起こります。カーソルに何らかの視覚的表示があった場合に役立ちます。


19
1つのルールを学ぶことをお勧めします:入力を中止=>挿入モードを終了します。そうすれば、挿入モードではないことを忘れてしまうような状況を決して観察することはありません。
ZyX

2
@ZyX 除いあなたが停止し、タイピングした後、挿入モードを終了することを忘れたとき:pは
gented

3
@ZyXは良い規則であり、私は常にそうしていますが、視覚的なインジケータは依然として重要です。マリファナは合法であり、私がいつもやっていることを忘れています。
felwithe

回答:


107

挿入モードへの切り替えと挿入モードからの切り替えを示す一般的なオプションcursorlineは、現在の画面の行が強調表示されているかどうかを示すオプションの切り替えです(を参照:help cursorline)。

:autocmd InsertEnter,InsertLeave * set cul!

または、代わりに

:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul

変更CursorLine(参照お好みに合わせてカーソルラインのスタイルを変更するためにハイライト表示グループを:help :highlightして :help highlight-groups)。


5
また、culをデフォルトの下線ではなくハイライトbgに設定しました。hi CursorLine cterm = NONE ctermbg = black
Nikita Prokopov

これがcygwinのvimで機能しない理由はありますか?私はエディターで両方の行のセットを入力しましたが、列または行全体のハイライトを超えて、どのような種類の強調表示も設定できませんでした
TankorSmash

@Tankor:このcursorlineオプションは、プラットフォーム固有の機能には依存しません。この+syntax機能でコンパイルされたすべてのVimインスタンスで使用できます(通常はそうです)。
ib。

:もちろん、あなたの〜/ .vimrcとZOのような耐久性のためにその保存echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
錬金術

75

以下は、Linux上のxterm、urxvt、およびその他のターミナルエミュレータで動作します。macOS上のiTerm2; Windows上のConEmuでのGit Bash。その他(コメントを参照):

let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"

" Optionally reset the cursor on start:
augroup myCmds
au!
autocmd VimEnter * silent !echo -ne "\e[2 q"
augroup END

その他のオプション(番号をの後に置き換えます\e[):

Ps = 0  -> blinking block.
Ps = 1  -> blinking block (default).
Ps = 2  -> steady block.
Ps = 3  -> blinking underline.
Ps = 4  -> steady underline.
Ps = 5  -> blinking bar (xterm).
Ps = 6  -> steady bar (xterm).

あなたが使用する場合tmuxは、(なくても、そのようにそれを使用することが重要である\<Esc>Ptmux;エスケープ)。ウィンドウ/ペインを切り替えると、tmuxは正しいカーソルの形状を追跡します。

うまくいかない場合は、TERM=xterm-256colortmuxを開始する前に設定するか、これを追加してください.tmux.conf@Steven Luに感謝します)。

set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'

2
現在、優れた作業能力を備えています
Steven Lu

xfce4-terminalで完璧に動作します
korst1k 2017

:それはパテでは動作しない理由について@Charlesは、この参照superuser.com/questions/304318/...
WesternGun

1
私の更新:set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'tmux構成で最終的に動作します。どうやらsetfor terminal-overridesなし-aで使用すると、デフォルトですでに設定されている設定が上書きされます。
Steven Lu

1
ソリューションは、単純なターミナル(suckless st)で挿入モードから通常モードに形状を変更する際に大幅な遅延があります
daGo

16

使用している場合はtmuxはiTerm2をのMacOS
以下のブロックからカーソルやハイライトにカーソルを変更し、現在の行

if exists('$TMUX')
  let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
  let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
else
  let &t_SI = "\<Esc>]50;CursorShape=1\x7"
  let &t_EI = "\<Esc>]50;CursorShape=0\x7"
endif
:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul

クレジット:https : //gist.github.com/andyfowler/1195581


1
これはiTermに固有のものであることに注意してください。標準的なものも実際には機能しますが、他のすべてのサポート端末でも機能するため、これはおそらく間違った答えです。こちらをご覧ください-> stackoverflow.com/a/42118416/340947
Steven Lu

@StevenLuは、実際には提案された回答の1つがiTerm2(Mac)では機能しませんでしたが、これは機能しました。このものはあなたが予想するよりも面倒です。
CS

このカーソルは間違いなく手ごわいものの1つです。tmuxがカーソル状態の追跡を実行していないように見えるので、私は適切な設定をしているとさえ考えていません。挿入モードでvimがカーソルを行に設定できるようにするだけで十分満足です。
Steven Lu

私はこれを理解しました。解決策は、それを適切に処理するためにtmuxを微調整することです。私がする必要があったことは、私のtmux設定terminal-overridesが追加されているだけであることを確認することでしたので、の,*:Ss=\E[%p1%d q:Se=\E[2 q一部を壊しませんでしたterminal-overrides。したがって、私の構成は次のようになりますset -sa terminal-overrides ",xterm-256color-italic:Tc"(カーソルスタイルSs / Seを踏みつぶすことなく有効にする24ビットカラーを設定するには
Steven Lu

13

さまざまなモードでカーソルの形状を変更するには、.vimrcファイルに以下を追加します。

GNOME端末(バージョン2.26)の場合:

if has("autocmd")
  au InsertEnter * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"
  au InsertLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape block"
  au VimLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"
endif

GNOMEターミナルで複数のプロファイルを使用する場合は、これをプロファイルに適合させる必要がある場合があります。

KDE4のKonsoleの場合:

let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"

これは複数のタブとウィンドウで機能します。

参照:「異なるモードの変更カーソルの形状の」Vimのヒントウィキ


13
私は主にtmuxでvimをパテ付きのsshよりも使用しています。より普遍的なオプションはありますか?
lanrat

魅力のように働いた。ありがとう。
Ernest

1
gconftool-2コマンドを使用してgnome-terminalの設定を変更することは非常に悪い考えです。vimが実行されているターミナルだけでなく、同じプロファイルの他の現在および将来のすべてのgnome-terminalタブにも影響します。
egmont 2016

これはkonsoleで機能します。ありがとうございます。しかし、1つの問題は、挿入モードの終了が遅いことです。理由は不明です
Hoang Tran

1
@HoangTranの使用set ttimeoutlen=0
バナナッチ2017

10

あなたはterminus vimプラグインを試すことができます

挿入モードでは、カーソルの形状が細い縦棒に変わります。置換モードでは、下線に変わります。通常モードに戻ると、標準の「ブロック」形状に戻ります。


これは最も賢明な解決策のようです。VIMには、このための:setが直接あるはずです(標準)。
user12711

要件:gnome-terminal(wiki.gnome.org/Apps/Terminal)およびVTEライブラリを使用するその他の端末(github.com/GNOME/vte):部分的にサポートされています(たとえば、カーソルの形状の変更はサポートされていますが、フォーカスレポートはサポートされていません)。私の場合(gnome-terminal 3.6.2)まったく機能しません。
daGo

8

挿入モードではカーソルを点滅させ、他のモードでは静的にしておくと便利です。

set guicursor+=n-v-c:blinkon0

2

Escキーを押して通常モードに戻ってブロックカーソルを表示した後、他の誰かが遅延に直面しているかどうかはわかりませんが、そうであれば、これも私が修正する方法です。

実際、私はiTerm2を使用しており、macOSのターミナル内でVimを使用しています。また、挿入モードに入ると、カーソルはまだブロックであり、挿入モードまたは通常モードのときは混乱します。

MacVimのように、挿入モードでは細い線をカーソルとして表示し、通常モードではブロックに戻したいと思っていました。そしてそれを行うには、それは非常に簡単です、これをここで説明するように私の.vimrcファイルに追加するだけです

let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"

ここに画像の説明を入力してください

しかし、ご覧のように、を押してESC挿入モードを終了して通常モードに戻し、ブロックを再びカーソルとして表示すると遅延が発生しました。だからそれを修正するために私はこれを見つけました:

set ttimeout
set ttimeoutlen=1
set listchars=tab:>-,trail:~,extends:>,precedes:<,space:.
set ttyfast

そして今見ることができるようにそれはかなりうまく働きます:

カーソルとしてブロックに戻るまでの遅延を修正

私はそれが他の誰にも役立つことを願っています!👻


1

これは他の人がすでに提供している答えに多くを追加するとは思わないが、何とかして1つの場所に物事を要約し、関連する参照へのリンクも付けたかった。

これは、私の関連するスニペット.vimrcです。

    " Cursor appearance
    "
    " See also: [1]'ANSI Control Functions Summary', [2]DECSCUSR, [3]xterm+tmux
    "   entry in terminfo.src.
    " [1] https://www.vt100.net/docs/vt510-rm/chapter4.html
    " [2] https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
    " [3] https://raw.githubusercontent.com/mirror/ncurses/master/misc/terminfo.src
    "
    " On:
    " - entered insert mode
    let &t_SI = "^[[5 q^[]12;Magenta\007" " blinking bar (Ss) in magenta (Cs)
    " - entered replace mode
    let &t_SR = "^[[0 q^[]12;Red\007" " blinking block (Ss) in red (Cs)
    " - leaving insert/replace mode
    let &t_EI = "^[[2 q^[]112\007" " terminal power-on style (Se) and colour (Cr)

注:'^['文字は、実際には1つのESC(エスケープシーケンス)制御文字です。


0

これはxfce4-terminalで正しく動作します:

次のスクリプトを追加します .vimrc

if has("autocmd")
  au InsertEnter * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_BLOCK/TERMINAL_CURSOR_SHAPE_IBEAM/' ~/.config/xfce4/terminal/terminalrc"                                                                                          
  au InsertLeave * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_IBEAM/TERMINAL_CURSOR_SHAPE_BLOCK/' ~/.config/xfce4/terminal/terminalrc"                                                                                          
  au VimLeave * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_IBEAM/TERMINAL_CURSOR_SHAPE_BLOCK/' ~/.config/xfce4/terminal/terminalrc"  
endif

簡単に言うと、xfce4-terminalは設定を.config/xfce4/terminal/terminalrcファイルに保存します。スクリプトは、挿入モードのときに変更さTERMINAL_CURSOR_SHAPE_BLOCKTERMINAL_CURSOR_SHAPE_IBEAM、挿入モードまたはvimを終了するとブロックに戻ります。変更する自由を感じるIBEAMあなたが欲しいものを(BLOCKIBEAMおよびUNDERLINE利用可能)。


0

の最新バージョンを使用しnvimていて、これを実現したい場合は、上記のこれらの空想的な回避策のいくつかを回避できます。

以下の設定は、通常モードではブロックカーソルから、置換では下線カーソルに、挿入では行カーソルに切り替わります。

# ~/.tmux.conf
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"
set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q',w

" ~/.vimrc
" Sets cursor styles
" Block in normal, line in insert, underline in replace
set guicursor=n-v-c-sm:block,i-ci-ve:ver25-Cursor,r-cr-o:hor20

私はこれらの2つのソースから引き出された次の設定でこれをうまく機能させることができました。

チュイカーソル形

ギカーサー


-2

私は通常、とりわけ現在のvimモードをステータスラインに持っています。単純さを求める場合は、この情報のみをステータスラインに設定できます。

ただし、通常、本当に奇妙なことは、Caps Lockを押してコマンドモードにすると発生します(hjklはHJKLになっているため、JとKだけで、何が起こっているのかわからないときに髪を引っ張ることができます。:h Jそして:h K、私が何を意味するのかを見るために)。ただ、キーロックのキャップを注意してください、あなたが最も時間のIMO大丈夫です。


46
これはどのように質問に答えますか?
デビッドリバーズ、

1
@DavidRiversこれはXY問題のアプリケーションであり、OPは彼の問題の解決策を求めていました(vimノーマルモードであることを知らず、カーソルがそれを示すように変化することを望んでいます)が、代替案(そしてIMOではなく、素晴らしい)ソリューション(彼のステータスラインを州で強化)
Steven Lu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.