Pourquoi la touche Retour arrière ne fonctionne-t-elle pas en mode insertion?

146

Essayer de supprimer des caractères en mode insertion avec la backspaceclé ne semble parfois pas fonctionner. Je peux backspace parfois , mais à d'autres moments cela ne fait rien; le curseur ne va pas à gauche, et absolument rien ne semble se passer.

J'ai remarqué cela en utilisant gVim dans Windows. Le backspacesemble fonctionner comme prévu lors de l' utilisation du terminal Vim dans la plupart des systèmes Linux cependant.

  1. Pourquoi cela arrive-t-il?
  2. Comment faire en sorte que la backspaceclé supprime les caractères comme d'habitude?
  3. Ce comportement est-il conçu comme une fonctionnalité? En d'autres termes: existe-t-il de meilleures alternatives à la backspacesuppression de caractères en mode insertion?
glS
la source
Alors que la réponse ci-dessous résout correctement votre problème, j'ai constaté que la désactivation de touches telles que les touches fléchées ou les touches de retour arrière vous aide à vous habituer à faire les choses plus correctement. Le retour arrière dans vim est fait avec X(et supprimer avec x), mais souvent ce que vous vouliez faire était dbpar exemple de supprimer jusqu'au début du mot, ou dawde supprimer le mot entier, etc. Si vous avez un retour arrière disponible, vous risquez de l'utiliser. clé sous-optimale dans plus de cas que nécessaire.
Shahbaz
5
@ Shahbaz Je ne suis pas d'accord: en mode insertion, il est logique de pouvoir effectuer des corrections mineures à l'aide de la touche Retour arrière. Je conviens qu’il faut apprendre à utiliser les commandes du mode normal, mais il n’est pas inopportun d’utiliser le retour arrière en mode insertion pour les corrections mineures.
Karl Yngve Lervåg le
3
@ KarlYngveLervåg, dans le cas du retour arrière, je suis d'accord (en fait, je ne l'ai pas désactivé moi-même). Cependant, il semble que le comportement par défaut du retour arrière de l'OP ne fonctionne pas, par exemple, avec le début de la ligne, mais au sein de la ligne. Néanmoins, le PO dispose de meilleures options que le retour arrière. Par exemple, au lieu de revenir en arrière à la ligne précédente, on peut utiliser également l’utilisation Jdes espaces blancs. En bref, le retour arrière convient aux corrections rapides de fautes de frappe en écriture, mais à part cela, il existe de meilleures alternatives.
Shahbaz
1
Le problème de nombreuses personnes n’est pas en désaccord avec la fonctionnalité en soi, mais il n’est pas le seul éditeur qu’il utilise. Comme ils utilisent plusieurs éditeurs, il est contre-intuitif de changer de paradigme lié au retour arrière afin qu'ils préfèrent un sous-ensemble des fonctionnalités de vim.
j riv
Si vous avez installé vim-faq , vous pouvez y obtenir une réponse hors ligne: :h vim-faqet effectuer une recherche /backspace. Le tag difficile à mémoriser est :h faq-12.26.
Hotschke le

Réponses:

178

tl; dr: Ajoutez ceci à votre vimrc pour que le retour arrière fonctionne comme dans la plupart des autres programmes:

set backspace=indent,eol,start

Réponse plus longue

Bien que le comportement par défaut puisse être surprenant, le retour arrière "ne fonctionne pas" peut être considéré comme une fonctionnalité ; cela peut vous empêcher de supprimer accidentellement l'indentation et de supprimer trop de texte en le limitant à la ligne en cours et / ou au début de l'insertion.

:help 'backspace' nous dit:

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.

Alors, que signifient ces valeurs exactement?

indent
Vim ajoute une indentation automatique à de nombreux types de fichiers; par défaut, vous n'êtes pas autorisé à revenir en arrière sur cela; les règles de ce qui est considéré comme une 'autoindentation' sont quelque peu subtiles, par exemple, si nous tapions ceci (où █ est le curseur):

if :; then
    █

L'espacement arrière ne fonctionnera pas.

Mais si nous ajoutons ensuite une commande et le fi, et remontons, nous sommes autorisés à supprimer l'indentation:

if :; then
    █:
fi

En effet, dans le premier exemple, Vim a déterminé qu'il devrait ajouter 1 niveau d'indentation lorsque vous avez appuyé sur Entrée. mais dans le deuxième exemple, Vim n'a pas d'indentité automatique, il s'agit simplement de caractères de tabulation ou de quelques espaces.

Regarde aussi :help 'autoindent'

eol
Cela devrait être la solution la plus évidente. Appuyer sur la touche Retour arrière supprime également les marqueurs EOL ( \nou \r\n). si elle est désactivée, Backspace ne fera rien si vous essayez de supprimer un marqueur EOL.

commencer
Cela signifie que vous pouvez seulement supprimer du texte que vous avez inséré depuis le mode d'insertion a commencé, et vous ne pouvez pas supprimer un texte qui a déjà été inséré.

Alors, quel est le réglage par défaut?

J'ai remarqué cela en utilisant GVIM dans Windows. Le retour arrière semble cependant fonctionner normalement lors de l’utilisation du VIM à partir du terminal dans la plupart des systèmes Linux.

La raison en est que de nombreuses distributions Linux proposent des fichiers vimrc préconfigurés qui définissent des options communes. Par exemple, sur mon système Arch Linux, j'ai /usr/share/vim/vimfiles/archlinux.vim:

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

Si vous installez Vim sous Windows, le comportement par défaut consiste à utiliser les commandes vimrc et gvimrc par défaut fournies avec Vim.

La valeur par défaut de Vim est une valeur vide pour backspace. Arch Linux, Debian, CentOS ou les valeurs $other_distropar défaut peuvent être différentes.

Mode normal

Cette question concerne le retour arrière en mode insertion, mais permettez-moi d'ajouter quelques brèves remarques à propos du retour arrière en mode normal.

En mode normal, le retour arrière agit comme si h, il se dirigeait simplement vers la gauche.

Par défaut, le retour arrière va à la ligne précédente si au début d'une ligne (comme si elle eolétait dedans backspace); vous pouvez contrôler ce comportement avec l' 'whichwrap'option via l' bindicateur (activé par défaut).

Vous pouvez également faire supprimer des caractères de retour arrière en le mappant à la Xcommande:

nnoremap <BS> X
Martin Tournoij
la source
1
Je pense que ce "_Xserait un comportement "plus naturel" pour <BS>.
Hauleth
2
Il est à noter que presque aucune distribution n’est livrée avec le comportement par défaut. Le seul que j'ai remarqué était msys2 et ce n'était probablement pas une décision mais sa nature d'être sous-développé.
j riv
5

Au cas où quelqu'un aurait eu un <BS>comportement non explicable lors de l'utilisation de ConEmu sous Windows, vous devrez peut-être remapper la <BS>clé sur:

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

Plus d'information

Walker Boh
la source
1
set backspace=2

est utilisé avec les versions 5.4 et antérieures. travaillé pour moi sur mac.

on dirait que sur mac j'ai v3.2:

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

Toutes les versions antérieures à 3.2 utilisent la licence publique générale GNU v3 (GPLv3), qu'Apple n'est pas en faveur de la prise en charge. Une discussion sur reddit à ce sujet est ici .

Vous pouvez passer à la dernière version de Bash avec:

brew install bash

cela permet de tirer parti de l'achèvement programmable mis en évidence ici .

tkjef
la source
0

Si set backspace=indent,eol,startest la dernière ligne de votre vimrc, aucune des solutions ne fonctionnera.

Ajoutez une autre règle après ceci, par exemple:

set ruler
Mohammad Shahid Siddiqui
la source
4
Cela me semble assez étrange. Pouvez-vous expliquer pourquoi ajouter une autre commande à votre vimrc ferait fonctionner la précédente?
statox