เหตุใดคีย์ Backspace จึงไม่ทำงานในโหมดแทรก


146

การพยายามลบอักขระในโหมดแทรกด้วยbackspaceแป้นในบางครั้งดูเหมือนจะไม่ทำงาน backspace บางครั้งฉันสามารถแต่ในเวลาอื่นมันไม่ทำอะไรเลย; เคอร์เซอร์ไม่ไปทางซ้ายและไม่มีอะไรเกิดขึ้น

ฉันสังเกตเห็นสิ่งนี้โดยใช้ gVim ใน Windows backspaceดูเหมือนว่าจะทำงานตามที่คาดไว้ในขณะที่ใช้เป็นกลุ่มจากสถานีในระบบ Linux มากที่สุด แต่

  1. ทำไมสิ่งนี้ถึงเกิดขึ้น
  2. ฉันจะทำให้backspaceคีย์ลบอักขระได้ตามปกติได้อย่างไร
  3. พฤติกรรมนี้มีจุดประสงค์เพื่อเป็นสถานที่หรือไม่? กล่าวอีกนัยหนึ่ง: มีทางเลือกอื่นที่ดีกว่าสำหรับการbackspaceลบอักขระในโหมดแทรกหรือไม่?

ในขณะที่คำตอบด้านล่างแก้ปัญหาของคุณได้อย่างถูกต้องฉันพบว่าการปิดใช้งานคีย์เช่นปุ่มลูกศรหรือ backspace ช่วยให้คุณคุ้นเคยกับการทำสิ่งต่าง ๆ ได้อย่างถูกต้องมากขึ้น Backspace in vim นั้นทำด้วยX(และลบด้วยx) แต่บ่อยครั้งที่สิ่งที่คุณต้องการทำdbเช่นเพื่อลบจนกระทั่งเริ่มต้นคำหรือdawเพื่อลบทั้งคำเป็นต้นหากคุณมี backspace ว่างคุณมีความเสี่ยงในการใช้สิ่งนี้ คีย์ย่อยในกรณีที่เกินความจำเป็น
Shahbaz

5
@Shahbaz ฉันไม่เห็นด้วย: ในขณะที่อยู่ในโหมดแทรกมันมีเหตุผลที่จะสามารถทำการแก้ไขเล็กน้อยโดยใช้ปุ่ม backspace ฉันยอมรับว่าควรเรียนรู้วิธีใช้คำสั่งโหมดปกติ แต่มันไม่ได้ใช้งาน backspace ในขณะที่อยู่ในโหมดแทรกสำหรับการแก้ไขเล็กน้อย
Karl Yngve Lervåg

3
@ KarlYngveLervågในกรณีของ backspace ฉันเห็นด้วย (จริง ๆ แล้วฉันไม่ได้ปิดใช้งานตัวเอง) อย่างไรก็ตามดูเหมือนว่า OP จะมีพฤติกรรมเริ่มต้นของ backspace ซึ่งไม่สามารถทำงานได้เช่นเริ่มต้นบรรทัด แต่ทำงานภายในบรรทัด ยังคง OP มีตัวเลือกที่ดีกว่า backspace ตัวอย่างเช่นแทนที่จะย้อนกลับไปที่บรรทัดก่อนหน้าหนึ่งสามารถใช้Jซึ่งดูแลช่องว่างเช่นกัน กล่าวโดยย่อ Backspace ใช้ได้กับการพิมพ์ผิดที่รวดเร็วระหว่างการเขียน แต่นอกเหนือจากนั้นจะมีทางเลือกที่ดีกว่า
Shahbaz

1
ปัญหาของหลาย ๆ คนไม่ได้ขัดแย้งกับฟีเจอร์ต่อ se แต่มันไม่ใช่ตัวแก้ไขเดียวที่พวกเขาใช้ เนื่องจากพวกเขาใช้เครื่องมือแก้ไขหลายตัวมันจึงตอบโต้ได้ง่ายเพื่อสลับกระบวนทัศน์ที่เกี่ยวข้องกับ Backspace ดังนั้นพวกเขาจึงชอบคุณสมบัติย่อยบางส่วน
j riv

หากคุณติดตั้งเป็นกลุ่มคำถามที่พบบ่อย , คุณจะได้รับคำตอบแบบออฟไลน์ที่นั่นและค้นหา:h vim-faq ยากที่จะจดจำแท็ก/backspace :h faq-12.26
Hotschke

คำตอบ:


178

tl; dr: เพิ่มสิ่งนี้ไว้ใน vimrc ของคุณเพื่อให้ Backspace ทำงานเหมือนในโปรแกรมอื่น ๆ ส่วนใหญ่:

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.

ดังนั้นค่าเหล่านี้มีความหมายว่าอะไร?

indent
Vim เพิ่มการเยื้องอัตโนมัติสำหรับหลาย ๆ ไฟล์ โดยค่าเริ่มต้นคุณจะไม่ได้ รับอนุญาตให้ถอยกลับเหนือสิ่งนี้ กฎของสิ่งที่ถือว่าเป็น 'autoindentation' นั้นค่อนข้างบอบบางตัวอย่างเช่นถ้าเราจะพิมพ์สิ่งนี้ (โดยที่█เป็นเคอร์เซอร์):

if :; then
    █

การถอยกลับจะไม่ทำงาน

แต่ถ้าเรานั้นก็จะเพิ่มคำสั่งและfiและกลับไปขึ้นเราจะ ได้รับอนุญาตให้นำออกเยื้อง:

if :; then
    █:
fi

นี่เป็นเพราะในตัวอย่างแรก Vim ระบุว่าควรเพิ่มการเยื้อง 1 ระดับเมื่อคุณกด Enter แต่ในตัวอย่างที่สองกลุ่มที่ไม่ได้ทำอะไรอัตโนมัติมันเป็นเพียงแค่ตัวละครแท็บหรือช่องว่างไม่กี่

ยังดู :help 'autoindent'

eol
สิ่งนี้ควรชัดเจนที่สุดการกด Backspace จะลบเครื่องหมาย EOL ( \nหรือ\r\n); หากปิดการใช้งาน Backspace จะไม่ทำอะไรเลยถ้าคุณพยายามลบเครื่องหมาย EOL

เริ่มต้น
หมายความว่าคุณสามารถเพียงลบข้อความที่คุณได้แทรกตั้งแต่โหมดแทรกเริ่มต้นและคุณไม่สามารถลบข้อความใด ๆ ที่แทรกไว้ก่อนหน้านี้

ดังนั้นการตั้งค่าเริ่มต้นคืออะไร

ฉันสังเกตเห็นสิ่งนี้โดยใช้ GVIM ใน windows Backspace ดูเหมือนว่าจะทำงานได้ตามที่คาดไว้ในขณะที่ใช้ VIM จากเทอร์มินัลในระบบ Linux ส่วนใหญ่

เหตุผลนี้เป็นเพราะลีนุกซ์หลายรุ่นมาพร้อมกับไฟล์ vimrc ซึ่งตั้งค่าตัวเลือกทั่วไปไว้ ตัวอย่างเช่นในระบบ Arch Linux ของฉันฉันมี/usr/share/vim/vimfiles/archlinux.vim:

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

หากคุณติดตั้ง Vim บน Windows ค่าเริ่มต้นคือการใช้ vimrc เริ่มต้นและ gvimrc ที่ Vim จัดส่งมาพร้อมกับ

เป็นกลุ่มbackspaceเริ่มต้นเป็นค่าว่างสำหรับ Arch Linux, Debian, CentOS หรือ$other_distroค่าเริ่มต้นอาจแตกต่างกัน

โหมดปกติ

คำถามนี้เกี่ยวกับ Backspace ในโหมดแทรก แต่ให้ฉันเพิ่มหมายเหตุสั้น ๆ เกี่ยวกับ Backspace ในโหมดปกติ

ในโหมดปกติ Backspace ทำหน้าที่เหมือนhเพิ่งไปทางซ้าย

โดยค่าเริ่มต้น backspace จะไปที่บรรทัดก่อนหน้าถ้าเริ่มต้นบรรทัด (เหมือนeolในbackspace) คุณสามารถควบคุมพฤติกรรมนี้ด้วย'whichwrap'ตัวเลือกผ่านการbตั้งค่าสถานะ (เปิดใช้งานโดยค่าเริ่มต้น)

นอกจากนี้คุณยังสามารถสร้างแบ็กสเปซลบอักขระโดยการแม็พกับXคำสั่ง:

nnoremap <BS> X

1
ผมคิดว่า"_Xจะเป็นพฤติกรรมของ "ธรรมชาติมากขึ้น" <BS>สำหรับ
Hauleth

2
เป็นที่น่าสังเกตว่าแทบจะไม่มีการกระจายสินค้าพร้อมกับพฤติกรรมเริ่มต้น สิ่งเดียวที่ฉันสังเกตเห็นคือ msys2 และนั่นอาจไม่ใช่การตัดสินใจ แต่ลักษณะของการด้อยพัฒนา
j riv

5

ในกรณีที่ทุกคนมีประสบการณ์ที่ไม่สามารถอธิบาย<BS>พฤติกรรมโดยใช้ ConEmu บน Windows คุณอาจต้องทำการแมป<BS>กุญแจใหม่เพื่อ:

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

ข้อมูลมากกว่านี้


1
set backspace=2

ใช้กับ v5.4 และรุ่นก่อนหน้า ทำงานสำหรับฉันใน mac

ดูเหมือนว่าบน mac i มี 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 v3 (GPLv3) ซึ่ง Apple ไม่สนับสนุน การอภิปรายเมื่อ Reddit เกี่ยวกับเรื่องนี้ที่นี่

คุณสามารถอัพเกรดเป็น Bash ใหม่ล่าสุดด้วย:

brew install bash

นี้จะช่วยให้การใช้ประโยชน์จากเสร็จสิ้นการตั้งโปรแกรมไฮไลต์ที่นี่


0

หากset backspace=indent,eol,startเป็นบรรทัดสุดท้ายของคุณจะvimrcไม่มีวิธีแก้ไขปัญหาใด ๆ

เพิ่มอีกหนึ่งกฎหลังจากนี้เช่น:

set ruler

4
ดูเหมือนว่าแปลกสำหรับฉันคุณช่วยอธิบายได้ไหมว่าทำไมการเพิ่มคำสั่งอื่นเข้าไปใน vimrc ของคุณจะทำให้คำสั่งก่อนหน้านี้ทำงานได้หรือไม่
statox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.