Tại sao phím backspace không hoạt động ở chế độ chèn?


146

Cố gắng xóa các ký tự trong chế độ chèn bằng backspacephím đôi khi dường như không hoạt động. backspace Đôi khi tôi có thể , nhưng đôi khi nó không làm gì cả; con trỏ không đi bên trái và dường như không có gì xảy ra.

Tôi nhận thấy điều này bằng cách sử dụng gVim trong Windows. Tuy nhiên, backspacedường như hoạt động như mong đợi trong khi sử dụng Vim từ thiết bị đầu cuối trong hầu hết các hệ thống Linux.

  1. Lý do tại sao điều này xảy ra?
  2. Làm thế nào tôi có thể làm cho các backspacephím xóa ký tự như bình thường?
  3. Là hành vi này nhằm mục đích như một tính năng? Nói cách khác: có những lựa chọn thay thế tốt hơn backspaceđể xóa các ký tự trong chế độ chèn không?

Mặc dù câu trả lời dưới đây giải quyết chính xác vấn đề của bạn, tôi đã thấy rằng việc tắt các phím như phím mũi tên hoặc phím lùi giúp bạn làm quen với việc thực hiện đúng hơn. Backspace trong vim được thực hiện bằng X(và xóa bằng x), nhưng thường thì những gì bạn thực sự muốn làm là dbxóa cho đến khi bắt đầu từ hoặc dawxóa toàn bộ từ, v.v. Nếu bạn có sẵn backspace, bạn có nguy cơ sử dụng từ này khóa tối ưu trong nhiều trường hợp hơn mức cần thiết.
Shahbaz

5
@Shahbaz Tôi không đồng ý: Trong khi ở chế độ chèn, có thể thực hiện các chỉnh sửa nhỏ bằng phím xóa lùi. Tôi đồng ý rằng người ta nên tìm hiểu cách sử dụng các lệnh chế độ thông thường, nhưng không nên sử dụng backspace trong khi ở chế độ chèn để sửa chữa nhỏ.
Karl Yngve Lervåg 24/2/2015

3
@ KarlYngveLervåg, trong trường hợp backspace tôi đồng ý (thực ra tôi không tự mình vô hiệu hóa nó). Tuy nhiên, có vẻ như OP có hành vi mặc định của backspace không hoạt động, ví dụ như bắt đầu dòng, nhưng hoạt động trong dòng. Tuy nhiên, OP có các tùy chọn tốt hơn backspace. Ví dụ, thay vì đặt khoảng cách trở lại dòng trước đó, người ta có thể sử dụng Jnó cũng chăm sóc các khoảng trắng. Nói tóm lại, backspace là tốt cho sửa lỗi chính tả nhanh trong khi viết, nhưng ngoài ra có những lựa chọn thay thế tốt hơn.
Shahbaz

1
Vấn đề của nhiều người không phải là sự bất đồng với tính năng này mà đó không phải là trình chỉnh sửa duy nhất họ sử dụng. Vì họ sử dụng nhiều trình soạn thảo, nó phản trực giác để chuyển đổi mô hình liên quan đến backspace nên họ thích một tập hợp các tính năng vim.
j đối thủ

Nếu bạn đã cài đặt vim-faq , bạn có thể nhận được câu trả lời ngoại tuyến ở đó: :h vim-faqvà tìm kiếm /backspace. Các thẻ khó để ghi nhớ là :h faq-12.26.
Hotschke

Câu trả lời:


178

tl; dr: Thêm phần này vào vimrc của bạn để làm cho backspace hoạt động như trong hầu hết các chương trình khác:

set backspace=indent,eol,start

Câu trả lời dài hơn

Mặc dù hành vi mặc định có thể gây ngạc nhiên, nhưng backspace "không hoạt động" có thể được coi là một tính năng ; nó có thể ngăn bạn vô tình xóa thụt lề và xóa quá nhiều văn bản bằng cách giới hạn nó ở dòng hiện tại và / hoặc bắt đầu chèn.

:help 'backspace' nói với chúng tôi:

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.

Vậy những giá trị này có ý nghĩa chính xác là gì?

thụt lề
Vim thêm thụt tự động cho nhiều kiểu tệp; theo mặc định, bạn không được phép sao lưu trên này; các quy tắc của những gì được coi là 'tự động' là hơi tinh tế, ví dụ, nếu chúng ta sẽ gõ cái này (trong đó █ là con trỏ):

if :; then
    █

Backspaces sẽ không hoạt động.

Nhưng nếu sau đó chúng ta sẽ thêm một lệnh và fi, và quay trở lại, chúng ta được phép xóa thụt lề:

if :; then
    █:
fi

Điều này là do trong ví dụ đầu tiên, Vim xác định cần thêm 1 mức thụt khi bạn nhấn Enter; nhưng trong ví dụ thứ hai, Vim không tự động làm bất cứ điều gì, đó chỉ là các ký tự Tab hoặc một vài khoảng trắng.

Cũng thấy :help 'autoindent'

eol
Đây là điều rõ ràng nhất, nhấn Backspace cũng loại bỏ các dấu EOL ( \nhoặc \r\n); nếu bị tắt, Backspace sẽ không làm gì nếu bạn cố xóa dấu EOL.

bắt đầu
Điều này có nghĩa là bạn chỉ có thể xóa văn bản bạn đã chèn kể từ khi chế độ chèn bắt đầu và bạn không thể xóa bất kỳ văn bản nào được chèn trước đó.

Vậy cài đặt mặc định là gì?

Tôi nhận thấy điều này bằng cách sử dụng GVIM trong windows. Backspace dường như hoạt động như mong đợi trong khi sử dụng VIM từ thiết bị đầu cuối trong hầu hết các hệ thống Linux.

Lý do cho điều này là do nhiều bản phân phối Linux với các tệp vimrc được tạo sẵn, thiết lập một số tùy chọn phổ biến. Ví dụ: trên hệ thống Arch Linux của tôi, tôi có /usr/share/vim/vimfiles/archlinux.vim:

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

Nếu bạn cài đặt Vim trên Windows, mặc định là sử dụng vimrc và gvimrc mặc định mà Vim gửi cùng.

Các Vim mặc định là một giá trị rỗng cho backspace. Arch Linux, Debian, CentOS hoặc $other_distromặc định có thể khác nhau.

Chế độ bình thường

Câu hỏi này là về Backspace trong chế độ chèn, nhưng tôi cũng xin thêm một số nhận xét ngắn gọn về Backspace ở chế độ bình thường.

Trong chế độ bình thường, Backspace hoạt động như h, nó chỉ đi về bên trái.

Theo mặc định, backspace sẽ đi đến dòng trước nếu ở đầu một dòng (như thể eollà trong backspace); bạn có thể kiểm soát hành vi này bằng 'whichwrap'tùy chọn thông qua bcờ (được bật theo mặc định).

Bạn cũng có thể tạo các ký tự xóa backspace bằng cách ánh xạ nó tới Xlệnh:

nnoremap <BS> X

1
Tôi nghĩ rằng đó "_Xsẽ là hành vi "tự nhiên hơn" cho <BS>.
Hauleth

2
Đáng lưu ý rằng hầu như không có tàu phân phối với hành vi mặc định. Người duy nhất tôi nhận thấy là msys2 và đó có lẽ không phải là một quyết định nhưng bản chất của nó là kém phát triển.
j đối thủ

5

Chỉ trong trường hợp bất kỳ ai là trải nghiệm không thể giải thích được <BS>bằng cách sử dụng ConEmu trên Windows, bạn có thể phải sắp xếp lại <BS>khóa để:

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

Thêm thông tin


1
set backspace=2

được sử dụng với v5.4 trở về trước. làm việc cho tôi trên mac.

Hình như trên mac tôi có v3.2:

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

Tất cả các phiên bản trước 3.2 đều sử dụng Giấy phép Công cộng GNU v3 (GPLv3) mà Apple không ủng hộ. Một cuộc thảo luận trên reddit về điều này là ở đây .

Bạn có thể nâng cấp lên Bash mới nhất với:

brew install bash

điều này cho phép tận dụng lợi thế của việc hoàn thành lập trình được nêu bật ở đây .


0

Nếu set backspace=indent,eol,startlà dòng cuối cùng của bạn vimrc, không có giải pháp nào sẽ hoạt động.

Thêm một quy tắc nữa sau này, ví dụ:

set ruler

4
Điều đó có vẻ khá kỳ lạ đối với tôi, bạn có thể giải thích tại sao việc thêm một lệnh khác vào vimrc của bạn sẽ làm cho lệnh trước hoạt động không?
statox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.