挿入モードでバックスペースキーが機能しないのはなぜですか?


146

backspaceキーを使用して挿入モードで文字を削除しようとしても、うまくいかない場合があります。できるbackspace こともありますが、それ以外の場合は何もしません。カーソルは左に行かず、まったく何も起こらないようです。

WindowsでgVimを使用してこれに気付きました。backspaceしかし、ほとんどのLinuxシステムで端末からVimを使用しながら、期待通りに動作しているようです。

  1. なぜこれが起こるのですか?
  2. backspace通常どおりにキーで文字を削除するにはどうすればよいですか?
  3. この動作は機能として意図されていますか?つまりbackspace、挿入モードで文字を削除するより良い代替手段はありますか?

以下の答えは問題を正しく解決しますが、矢印キーやバックスペースなどのキーを無効にすると、より適切に操作することに慣れることがわかりました。vimのバックスペースはX(およびで削除x)で行われますが、実際にやりたいことはdb、たとえば単語の先頭までdaw削除すること、単語全体を削除することなどです。必要以上の場合に最適でないキー。
Shahbaz

5
@Shahbaz私は同意しません:挿入モードでは、Backspaceキーを使用して軽微な修正を行うことができます。通常モードのコマンドの使用方法を学習する必要があることに同意しますが、軽微な修正のために挿入モードでバックスペースを使用することは不適切ではありません。
カールイングヴェレーヴァーグ

3
@KarlYngveLervåg、バックスペースの場合、私は同意します(実際、自分で無効にすることはありません)。ただし、OPにはバックスペースのデフォルトの動作があり、行の先頭などでは機能しませんが、行内で機能するようです。それでも、OPにはバックスペースよりも優れたオプションがあります。たとえば、前の行にバックスペースする代わりJに、空白も処理することができます。要するに、バックスペースは、書き込み中のタイプミスをすばやく修正するのに適していますが、それ以外にはより優れた代替手段があります。
シャーバズ

1
多くの人々の問題は、機能自体との不一致ではなく、彼らが使用する唯一のエディターではないということです。複数のエディターを使用するため、バックスペースに関連するパラダイムを切り替えてvim機能のサブセットを好むのは直感に反します。
J RIV

あなたがインストールしている場合のvim-よくある質問を、あなたがオフラインで答えを得ることができます:h vim-faqし、検索します/backspace。覚えにくいタグは:h faq-12.26です。
Hotschke

回答:


178

tl; dr:これをvimrcに追加して、他のほとんどのプログラムと同じようにバックスペースを機能させます。

set backspace=indent,eol,start

長い答え

デフォルトの動作は驚くべきことかもしれませんが、「機能しない」バックスペースは機能と見なすことができます。誤ってインデントを削除したり、現在の行や挿入の開始に制限することでテキストを削除しすぎたりするのを防ぐことができます。

:help 'backspace' 私たちに伝えます:

Influences the working of `<BS>`, `<Del>`, `CTRL-W` and `CTRL-U` in Insert
mode.  This is a list of items, separated by commas.  Each item allows
a way to backspace over something:

value     effect
indent    allow backspacing over autoindent
eol       allow backspacing over line breaks (join lines)
start     allow backspacing over the start of insert; CTRL-W and CTRL-U
          stop once at the start of insert.

それでは、これらの値は正確に何を意味するのでしょうか?

インデント
Vimは多くのファイルタイプに自動インデントを追加します。デフォルトでは、 これをバックスペースすること許可されていません。「自動インデント」と見なされるもののルールは、たとえば、これを入力する場合(█はカーソル)、多少微妙です:

if :; then
    █

バックスペースは機能しません。

我々は、コマンドを追加してしまう場合でもfi、最大戻って、我々がされている インデントを削除することができ:

if :; then
    █:
fi

これは、最初の例では、Enterキーを押したときにVimが1レベルのインデントを追加する必要があると判断したためです。ただし、2番目の例では、Vimは何も自動インデントしませんでした。タブ文字またはいくつかのスペースです。

こちらもご覧ください :help 'autoindent'

eol
これは最も明白なはずです。Backspaceを押すとEOLマーカー(\nまたは\r\n)も削除されます。無効にすると、EOLマーカーを削除しようとしてもBackspaceは何もしません。

start
これは、挿入モードが開始されてから挿入したテキストのみを削除でき、以前に挿入されたテキストは削除できないことを意味します。

それでは、デフォルト設定は何ですか?

WindowsでGVIMを使用してこれに気付きました。ただし、ほとんどのLinuxシステムで端末からVIMを使用している場合、バックスペースは期待どおりに動作するようです。

これは、多くのLinuxディストリビューションには、いくつかの一般的なオプションを設定する既製のvimrcファイルが付属しているためです。たとえば、私が持っているArch Linuxシステムでは/usr/share/vim/vimfiles/archlinux.vim

set nocompatible
set backspace=indent,eol,start
" ... and a few more...

VimをWindowsにインストールする場合、デフォルトでは、Vimに同梱されているデフォルトのvimrcおよびgvimrcが使用されます。

Vimの既定値は空の値ですbackspace。Arch Linux、Debian、CentOS、または$other_distroデフォルトは異なる場合があります。

ノーマルモード

この質問は、挿入モードのBackspaceについてですが、通常モードのBackspaceについても簡単に説明します。

通常モードでは、Backspaceはとして機能hし、左に移動します。

デフォルトでは、行の先頭にある場合、バックスペースは前の行に移動します(にあったかのようeolbackspace)。この動作は'whichwrap'bフラグ(デフォルトで有効)を介したオプションで制御できます。

Xコマンドにマッピングすることにより、バックスペースで文字を削除することもできます。

nnoremap <BS> X

1
私はそれ"_Xが「より自然な」行動だと思います<BS>
ハウレス

2
デフォルトの動作で出荷されるディストリビューションはほとんどないことに注意してください。私が気づいたのはmsys2だけであり、それはおそらく決定ではなく、開発が遅れているという性質でした。
j riv

5

<BS>WindowsでConEmuを使用して説明できない動作を経験したことがある場合に備えて、<BS>キーを次のように再マッピングする必要があります。

inoremap <Char-0x07F> <BS>
nnoremap <Char-0x07F> <BS>

詳しくは


1
set backspace=2

v5.4以前で使用されます。Macで私のために働いた。

Macではv3.2を持っているように見えます:

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

3.2以降のすべてのバージョンでは、GNU General Public License v3(GPLv3)を使用していますが、Appleはサポートを支持していません。これに関するredditの議論はここにあります

以下を使用して、最新のBashにアップグレードできます。

brew install bash

これにより、ここで強調表示されているプログラム可能な補完を利用できます


0

set backspace=indent,eol,startがの最後の行である場合vimrc、どのソリューションも機能しません。

この後にもう1つのルールを追加します。例:

set ruler

4
それは私にはかなり奇妙に思えますが、vimrcに別のコマンドを追加すると前のコマンドが機能する理由を説明できますか?
statox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.