Mengapa tombol backspace tidak berfungsi dalam mode insert?

146

Mencoba menghapus karakter dalam mode sisipkan dengan backspacetombol kadang-kadang tampaknya tidak berhasil. backspace Kadang - kadang saya bisa , tetapi di waktu lain tidak ada hasilnya; kursor tidak mengarah ke kiri, dan sama sekali tidak ada yang terjadi.

Saya perhatikan ini menggunakan gVim di Windows. Namun backspacetampaknya berfungsi seperti yang diharapkan saat menggunakan Vim dari terminal di sebagian besar sistem Linux.

  1. Mengapa ini terjadi?
  2. Bagaimana saya bisa membuat backspacekunci menghapus karakter seperti biasa?
  3. Apakah perilaku ini dimaksudkan sebagai fitur? Dengan kata lain: adakah alternatif yang lebih baik daripada backspacemenghapus karakter dalam mode penyisipan?
glS
sumber
Sementara jawaban di bawah ini dengan benar menyelesaikan masalah Anda, saya menemukan bahwa menonaktifkan kunci seperti tombol panah atau backspace membantu Anda terbiasa melakukan sesuatu dengan lebih baik. Backspace dalam vim dilakukan dengan X(dan menghapus dengan x), tetapi seringkali yang ingin Anda lakukan adalah dbmisalnya menghapus sampai awal kata, atau dawmenghapus seluruh kata dll. Jika Anda memiliki backspace yang tersedia, Anda berisiko menggunakan ini kunci suboptimal dalam banyak kasus dari yang diperlukan.
Shahbaz
5
@ Shahbaz Saya tidak setuju: Saat berada dalam mode insert, masuk akal untuk dapat membuat koreksi kecil menggunakan tombol backspace. Saya setuju bahwa seseorang harus belajar bagaimana menggunakan perintah mode normal, tetapi tidak tidak benar untuk menggunakan backspace saat dalam mode insert untuk koreksi kecil.
Karl Yngve Lervåg
3
@ KarlYngveLervåg, dalam kasus backspace saya setuju (sebenarnya saya tidak menonaktifkannya sendiri). Namun, sepertinya OP memiliki perilaku default dari backspace yang tidak berfungsi misalnya dengan mulai dari garis, tetapi bekerja di dalam garis. Namun, OP memiliki opsi yang lebih baik daripada backspace. Sebagai contoh, alih-alih backspacing ke baris sebelumnya, seseorang dapat menggunakan Jyang menangani spasi putih juga. Singkatnya, backspace baik untuk perbaikan kesalahan ketik cepat saat menulis, tetapi selain itu ada alternatif yang lebih baik.
Shahbaz
1
Masalah banyak orang bukanlah ketidaksepakatan dengan fitur itu sendiri tetapi bukan satu-satunya editor yang mereka gunakan. Karena mereka menggunakan banyak editor, itu kontra-intuitif untuk mengganti paradigma yang terkait dengan backspace sehingga mereka lebih suka subset dari fitur vim.
j riv
Jika Anda telah menginstal vim-faq , Anda bisa mendapatkan jawaban offline di sana: :h vim-faqdan cari /backspace. Tag yang sulit diingat adalah :h faq-12.26.
Hotschke

Jawaban:

178

tl; dr: Tambahkan ini ke vimrc Anda untuk membuat backspace berfungsi seperti di sebagian besar program lain:

set backspace=indent,eol,start

Jawaban yang lebih panjang

Meskipun perilaku default mungkin mengejutkan, backspace "tidak berfungsi" dapat dianggap sebagai fitur ; itu dapat mencegah Anda secara tidak sengaja menghapus lekukan, dan dari menghapus terlalu banyak teks dengan membatasinya ke baris saat ini dan / atau awal memasukkan.

:help 'backspace' memberi tahu kami:

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.

Jadi, apa sebenarnya nilai-nilai ini?

indent
Vim menambahkan lekukan otomatis untuk banyak tipe file; secara default, Anda tidak diizinkan mundur lebih dari ini; aturan dari apa yang dianggap sebagai 'autoindentation' agak halus, misalnya, jika kita akan mengetik ini (di mana the adalah kursor):

if :; then
    █

Backspacing tidak akan berfungsi.

Tetapi jika kita kemudian akan menambahkan perintah dan fi, dan kembali, kita akan diperbolehkan untuk menghapus lekukan:

if :; then
    █:
fi

Ini karena dalam contoh pertama, Vim memutuskan bahwa ia harus menambahkan 1 tingkat lekukan ketika Anda menekan Enter; tetapi dalam contoh kedua, Vim tidak autoindent apapun, itu hanya karakter Tab atau beberapa spasi.

Lihat juga :help 'autoindent'

eol
Ini harus menjadi yang paling jelas, menekan Backspace juga menghilangkan penanda EOL ( \natau \r\n); jika dinonaktifkan, Backspace tidak akan melakukan apa-apa jika Anda mencoba menghapus penanda EOL.

mulai
Ini berarti Anda hanya dapat menghapus teks yang telah Anda sisipkan sejak mode penyisipan dimulai, dan Anda tidak dapat menghapus teks apa pun yang sebelumnya disisipkan.

Jadi apa pengaturan default?

Saya perhatikan ini menggunakan GVIM di windows. Backspace tampaknya berfungsi seperti yang diharapkan saat menggunakan VIM dari terminal di sebagian besar sistem Linux.

Alasan untuk ini adalah karena banyak distro Linux menyediakan file vimrc yang sudah dibuat sebelumnya yang menetapkan beberapa opsi umum. Sebagai contoh pada sistem Arch Linux yang saya miliki /usr/share/vim/vimfiles/archlinux.vimdengan:

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

Jika Anda menginstal Vim di Windows, defaultnya adalah menggunakan vimrc dan gvimrc default yang dikirimkan oleh Vim.

The Vim default adalah nilai kosong untuk backspace. Arch Linux, Debian, CentOS, atau $other_distrodefault mungkin berbeda.

Mode normal

Pertanyaan ini tentang Backspace dalam mode insert, tapi izinkan saya juga menambahkan beberapa komentar singkat tentang Backspace dalam mode normal.

Dalam mode normal, Backspace bertindak sebagai h, itu hanya pergi ke kiri.

Secara default, backspace akan menuju ke baris sebelumnya jika pada awal baris (seolah-olah eolada di backspace); Anda dapat mengontrol perilaku ini dengan 'whichwrap'opsi melalui bflag (diaktifkan secara default).

Anda juga dapat membuat karakter hapus spasi mundur dengan memetakannya ke Xperintah:

nnoremap <BS> X
Martin Tournoij
sumber
1
Saya pikir itu "_Xakan menjadi perilaku yang "lebih alami" untuk <BS>.
Hauleth
2
Perlu dicatat bahwa hampir tidak ada distribusi yang dikirimkan dengan perilaku default. Satu-satunya yang saya perhatikan adalah msys2 dan itu mungkin bukan keputusan tetapi sifatnya yang terbelakang.
j riv
5

Kalau-kalau ada orang yang mengalami <BS>perilaku yang tidak bisa dijelaskan menggunakan ConEmu di Windows, Anda mungkin harus memetakan ulang <BS>kunci untuk:

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

Informasi lebih lanjut

Walker Boh
sumber
1
set backspace=2

digunakan dengan v5.4 dan sebelumnya. bekerja untuk saya di mac.

Sepertinya di mac saya punya v3.2:

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

Semua versi yang melewati 3.2 menggunakan GNU General Public License v3 (GPLv3), yang tidak didukung oleh Apple. Diskusi tentang reddit tentang ini ada di sini .

Anda dapat meningkatkan ke Bash terbaru dengan:

brew install bash

ini memungkinkan untuk memanfaatkan penyelesaian terprogram yang disorot di sini .

tkjef
sumber
0

Jika set backspace=indent,eol,startini adalah baris terakhir Anda vimrc, tidak ada solusi yang akan berfungsi.

Tambahkan satu aturan lagi setelah ini, misalnya:

set ruler
Mohammad Shahid Siddiqui
sumber
4
Itu tampak aneh bagi saya, dapatkah Anda menjelaskan mengapa menambahkan perintah lain ke vimrc Anda akan membuat yang sebelumnya berfungsi?
statox