Por que a tecla backspace não funciona no modo de inserção?


146

backspaceÀs vezes, tentar excluir caracteres no modo de inserção com a tecla parece não funcionar. backspace Às vezes posso , mas outras vezes não faz nada; o cursor não vai para a esquerda e absolutamente nada parece acontecer.

Notei isso usando o gVim no Windows. No backspaceentanto, parece funcionar como esperado enquanto você usa o Vim do terminal na maioria dos sistemas Linux.

  1. Por que isso acontece?
  2. Como posso fazer com que a backspacechave exclua caracteres como de costume?
  3. Esse comportamento pretende ser um recurso? Em outras palavras: existem alternativas melhores backspacepara excluir caracteres no modo de inserção?

Embora a resposta abaixo resolva corretamente o seu problema, descobri que desativar teclas como teclas de seta ou backspace ajuda a se acostumar a fazer as coisas de maneira mais adequada. O backspace no vim é feito com X(e excluído com x), mas geralmente o que você realmente queria fazer era dbexcluir até o início da palavra ou dawexcluir a palavra inteira etc. Se você tiver backspace disponível, corre o risco de usá-lo. chave subótima em mais casos do que o necessário.
Shahbaz

5
@ Shahbaz Não concordo: Enquanto estiver no modo de inserção, faz sentido poder fazer pequenas correções usando a tecla backspace. Concordo que se deve aprender a usar os comandos do modo normal, mas não é impróprio usar o backspace enquanto estiver no modo de inserção para pequenas correções.
Karl Yngve Lervåg

3
@ KarlYngveLervåg, no caso de backspace, eu concordo (na verdade, eu mesmo não o desativei). No entanto, parece que o OP tem o comportamento padrão de backspace, que não funciona, por exemplo, com o início da linha, mas funciona dentro da linha. Ainda assim, o OP tem melhores opções que o backspace. Por exemplo, em vez de retroceder para a linha anterior, pode-se usar o Jque também cuida dos espaços em branco. Em resumo, o backspace é adequado para correções rápidas de erros de digitação durante a gravação, mas, além disso, existem alternativas melhores.
Shahbaz

11
O problema de muitas pessoas não é um desacordo com o recurso em si, mas é o único editor que eles usam. Como eles usam vários editores, é contra-intuitivo alternar paradigmas relacionados ao backspace, para que eles prefiram um subconjunto dos recursos do vim.
j riv

Se você instalou o vim-faq , poderá obter uma resposta offline lá: :h vim-faqe pesquisar /backspace. A tag difícil de memorizar é :h faq-12.26.
Hotschke 23/07

Respostas:


178

tl; dr: Adicione isso ao seu vimrc para fazer o backspace funcionar como na maioria dos outros programas:

set backspace=indent,eol,start

Resposta mais longa

Embora o comportamento padrão possa ser surpreendente, o backspace "não está funcionando" pode ser considerado um recurso ; isso pode impedir que você remova acidentalmente o recuo e remova muito texto, restringindo-o à linha atual e / ou ao início da inserção.

:help 'backspace' diga-nos:

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.

Então, o que esses valores significam exatamente?

recuo O
Vim adiciona recuo automático para muitos tipos de arquivos; por padrão, você não tem permissão para retroceder sobre isso; as regras do que é considerado 'autoindentação' são um pouco sutis, por exemplo, se digitarmos isso (onde █ é o cursor):

if :; then
    █

O backspacing não funcionará.

Mas se, então, adicionar um comando e fi, e voltar a subir, nós estão autorizados a remover o recuo:

if :; then
    █:
fi

Isso ocorre porque no primeiro exemplo, o Vim determinou que ele deveria adicionar 1 nível de recuo quando você pressionou Enter; mas no segundo exemplo, o Vim não identificou nada automaticamente, são apenas caracteres de tabulação ou alguns espaços.

Veja também :help 'autoindent'

eol
Isso deve ser o mais óbvio, pressionar Backspace também remove marcadores EOL ( \nou \r\n); se desativado, o Backspace não fará nada se você tentar excluir um marcador EOL.

start
Isso significa que você pode excluir apenas o texto que inseriu desde que o modo de inserção foi iniciado e não pode excluir nenhum texto inserido anteriormente.

Então, qual é a configuração padrão?

Notei isso usando o GVIM no Windows. O backspace parece funcionar conforme o esperado enquanto estiver usando o VIM do terminal na maioria dos sistemas Linux.

A razão para isso é porque muitas distribuições Linux são fornecidas com arquivos vimrc pré-fabricados, que definem algumas opções comuns. Por exemplo, no meu sistema Arch Linux, tenho /usr/share/vim/vimfiles/archlinux.vimcom:

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

Se você instalar o Vim no Windows, o padrão é usar o vimrc e o gvimrc padrão que o Vim envia.

O padrão do Vim é um valor vazio para backspace. O Arch Linux, Debian, CentOS ou $other_distropadrão pode ser diferente.

Modo normal

Esta pergunta é sobre Backspace no modo de inserção, mas deixe-me também adicionar algumas breves observações sobre Backspace no modo normal.

No modo normal, o Backspace age como h, apenas vai para a esquerda.

Por padrão, o backspace irá para a linha anterior se no início de uma linha (como se eolestivesse backspace); você pode controlar esse comportamento com a 'whichwrap'opção através do bsinalizador (ativado por padrão).

Você também pode fazer com que o backspace exclua caracteres mapeando-o para o Xcomando:

nnoremap <BS> X

11
Eu acho que "_Xseria um comportamento "mais natural" para <BS>.
Hauleth

2
Vale ressaltar que quase nenhuma distribuição é fornecida com o comportamento padrão. O único que notei foi o msys2 e isso provavelmente não foi uma decisão, mas sua natureza de ser subdesenvolvido.
j riv

5

Caso alguém tenha um <BS>comportamento não explicável usando o ConEmu no Windows, talvez seja necessário remapear a <BS>chave para:

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

Mais Informações


1
set backspace=2

é usado com a v5.4 e anterior. trabalhou para mim no mac.

parece que no mac eu tenho a v3.2:

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

Todas as versões anteriores à 3.2 usam a Licença Pública Geral GNU v3 (GPLv3), que a Apple não é a favor do suporte. Uma discussão no reddit sobre isso está aqui .

Você pode atualizar para o Bash mais recente com:

brew install bash

isso permite tirar proveito da conclusão programável destacada aqui .


0

Se set backspace=indent,eol,startfor a última linha da sua vimrc, nenhuma das soluções funcionará.

Adicione mais uma regra depois disso, por exemplo:

set ruler

4
Isso me parece muito estranho, você poderia explicar por que adicionar outro comando ao seu vimrc faria o anterior funcionar?
statox
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.