Geri silme tuşu neden ekleme modunda çalışmıyor?


146

backspaceAnahtar ile ekleme modunda karakterleri silmeye çalışmak bazen işe yaramaz gibi geliyor. backspace Bazen yapabilirim , ama diğer zamanlarda hiçbir şey yapmıyor; imleç sola gitmez ve kesinlikle hiçbir şey olmuyor gibi görünür.

Bunu Windows'ta gVim kullanarak fark ettim. backspaceAncak çoğu Linux sistemlerinde terminalden Vim kullanırken beklendiği gibi çalışıyor gibi görünüyor.

  1. Bu neden oluyor?
  2. backspaceAnahtarın karakterleri her zamanki gibi silmesini nasıl sağlayabilirim ?
  3. Bu davranış bir özellik olarak mı tasarlandı? Başka bir deyişle: backspaceekleme modunda karakterleri silmek için daha iyi alternatifler var mı?

Aşağıdaki cevap sorununuzu doğru çözerken, ok tuşları veya geri alma gibi tuşları devre dışı bırakmanın işleri daha doğru şekilde yapmaya alışmanıza yardımcı olduğunu buldum. Vim'deki geri alma X(ve ile silme) ile yapılır x, ancak çoğu zaman gerçekten yapmak istediğiniz şey, dbörneğin kelimenin başlangıcına kadar silmek ya dawda tüm sözcüğü silmek vs.dir. gereğinden fazla durumda suboptimal anahtar.
Shahbaz

5
@Shahbaz Aynı fikirde değilim: Ekleme modundayken geri silme tuşunu kullanarak küçük düzeltmeler yapabilmek anlamlı olur. Birinin normal mod komutlarını nasıl kullanacağını öğrenmesi gerektiğine katılıyorum, ancak küçük düzeltmeler için ekleme modundayken geri alma özelliğinin kullanılması uygun değil.
Karl Yngve Lervåg

3
@ KarlYngveLervåg, backspace durumunda katılıyorum (aslında kendimi devre dışı bırakmıyorum). Bununla birlikte, OP, örneğin satır başlangıcı ile çalışmayan, satır içi çalışan varsayılan geri alma davranışına sahip gibi görünüyor. Yine de OP'nin backspace'den daha iyi seçenekleri var. Örneğin, bir önceki çizgiye geri gitmek yerine J, beyaz alanlarla da ilgilenen bir tane kullanabilirsiniz . Kısacası, geri yazma işlemi sırasında hızlı yazım hatası düzeltmeleri için iyidir, ancak bunun dışında daha iyi alternatifler vardır.
Shahbaz

1
Pek çok insanın sorunu, kendi başına özellik ile aynı fikirde değil, kullandıkları tek editör değil. Birden çok editör kullandıklarından, backspace ile ilgili paradigmaların değiştirilmesi sezgiseldir, bu nedenle vim özelliklerinin bir alt kümesini tercih ederler.
j riv

Eğer vim-faq kurduysanız , orada çevrimdışı bir cevap alabilirsiniz: :h vim-faqve arama /backspace. Ezberlemek etiketi zor :h faq-12.26.
Hotschke

Yanıtlar:


178

tl; dr: Geri almanın diğer programlardaki gibi çalışmasını sağlamak için bunu vimrc'nize ekleyin:

set backspace=indent,eol,start

Daha uzun cevap

Varsayılan davranış şaşırtıcı olsa da, "çalışmayan" geri alanı bir özellik olarak kabul edilebilir ; girintiyi yanlışlıkla temizlemenizi ve mevcut satırı ve / veya insertin başlangıcını sınırlayarak çok fazla metni kaldırmanızı önler.

:help 'backspace' bize söyler:

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.

Peki bu değerler tam olarak ne anlama geliyor?

indent
Vim birçok dosya türü için otomatik girintiyi ekler; varsayılan olarak, bunun üzerine geri adım atmanıza izin verilmez; “otoindenzasyon” olarak kabul edilenlerin kuralları, örneğin bunu yazarsak (ursor imleç):

if :; then
    █

Backspacing işe yaramaz.

O zaman bir komut ve eklersiniz Ama eğer five geri gitmek, biz vardır girinti kaldırmak için izin:

if :; then
    █:
fi

Bunun nedeni, ilk örnekte, Vim'in Enter tuşuna bastığınızda 1 girinti eklemesi gerektiğini; ancak ikinci örnekte, Vim hiçbir şeyi otomatik olarak bağlamadı, yalnızca Sekme karakterleri veya birkaç boşluk.

Ayrıca bakınız :help 'autoindent'

eol
Bu en açık olmalıdır, Backspace tuşuna basıldığında EOL işaretleyicileri de kaldırılır ( \nveya \r\n); devre dışı bırakılırsa, bir EOL işaretçisini silmeye çalışırsanız Backspace hiçbir şey yapmaz.

başlat
Bu, yalnızca ekleme modu başlatıldığından beri eklediğiniz metni silebileceğiniz ve önceden eklenmiş herhangi bir metni silemediğiniz anlamına gelir .

Peki varsayılan ayar nedir?

Bunu pencerelerde GVIM kullanarak fark ettim. Ancak, çoğu Linux sistemlerinde terminalden VIM kullanırken backspace beklendiği gibi çalışmaktadır.

Bunun nedeni, birçok Linux dağıtımının bazı ortak seçenekleri ayarlayan önceden yapılmış vimrc dosyalarıyla birlikte gönderilmesidir. Örneğin, Arch Linux sistemimde /usr/share/vim/vimfiles/archlinux.vim:

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

Vim'i Windows'a yüklerseniz, varsayılan, Vim'in birlikte verdiği varsayılan vimrc ve gvimrc'yi kullanmaktır.

Vim varsayılan için boş değerdir backspace. Arch Linux, Debian, CentOS veya $other_distrovarsayılan olarak farklı olabilir.

Normal mod

Bu soru, insert modunda Backspace ile ilgilidir, ancak normal modda Backspace hakkında da kısa açıklamalar ekleyeyim.

Normal modda, Backspace gibi davranır h, sadece sola gider.

(Sanki Varsayılan olarak, geri silme eğer bir satırın başında önceki satıra gidecek eololdu backspace); Bu davranışı bayrakla ( 'whichwrap'seçenek olarak betkinleştirilir) seçenekle kontrol edebilirsiniz .

Ayrıca, geri al Xkomutunu karakterle eşleyerek silme işlemi yapabilirsiniz :

nnoremap <BS> X

1
Bunun "_X"daha doğal" bir davranış olacağını düşünüyorum <BS>.
Hauleth

2
Neredeyse hiçbir dağıtımın varsayılan davranışla gönderilmediğini belirtmek gerekir. Fark ettiğim tek şey msys2 idi ve bu muhtemelen bir karar değildi, az gelişmiş olması.
j riv

5

<BS>Herhangi birinin Windows'ta ConEmu kullanarak açıklanamayan bir davranış deneyimi yaşamaması durumunda , <BS>anahtarı aşağıdaki noktaya getirmeniz gerekebilir :

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

Daha fazla bilgi


1
set backspace=2

v5.4 ve önceki sürümlerde kullanılır. Mac'te benim için çalıştı.

mac gibi görünüyor ben v3.2 var:

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

3.2'den sonraki tüm sürümler, Apple'ın desteklemesinden yana olmadığı GNU Genel Kamu Lisansı v3'ü (GPLv3) kullanır. Bu konuda reddit üzerine bir tartışma burada .

En yeni Bash'e yükseltme yapabilirsiniz:

brew install bash

Bu, burada vurgulanan programlanabilir tamamlama işleminden yararlanmanıza olanak sağlar .


0

Eğer set backspace=indent,eol,startsenin gerçek web son çizgidir vimrc, çözümlerin hiçbiri çalışacaktır.

Bundan sonra bir kural daha ekleyin, örneğin:

set ruler

4
Bu bana çok garip geliyor, neden vimrc'nize başka bir komut eklemenin bir öncekinin işe yaradığını açıklayabilir misiniz?
statox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.