백 스페이스 키가 삽입 모드에서 작동하지 않는 이유는 무엇입니까?


146

backspace키를 사용하여 삽입 모드에서 문자를 삭제하려고 시도하는 것이 때때로 작동하지 않는 것 같습니다. backspace 때로는 할 수 있지만 다른 경우에는 아무 것도하지 않습니다. 커서가 왼쪽으로 이동하지 않고 아무 일도 일어나지 않는 것 같습니다.

Windows에서 gVim을 사용하여 이것을 알았습니다. backspace그러나 대부분의 Linux 시스템에서 터미널에서 Vim을 사용하는 동안 예상대로 작동 하는 것 같습니다.

  1. 왜 이런 일이 발생합니까?
  2. backspace평소와 같이 키가 문자를 삭제 하도록하려면 어떻게 해야합니까?
  3. 이 동작은 기능을위한 것입니까? 즉 backspace, 삽입 모드에서 문자를 삭제 하는 더 나은 대안이 있습니까?

아래 답변이 문제를 올바르게 해결하는 동안 화살표 키 또는 백 스페이스와 같은 키를 사용하지 않으면 작업을보다 올바르게 수행하는 데 도움이됩니다. vim의 백 스페이스는 X(와 함께 삭제 x)로 수행되지만 실제로 실제로 원하는 것은 db예를 들어 단어가 시작될 때까지 daw삭제하거나 전체 단어를 삭제하는 것입니다. 필요한 경우보다 많은 경우 차선책 키.
Shahbaz

5
@Shahbaz 동의하지 않음 : 삽입 모드에서 백 스페이스 키를 사용하여 약간의 수정을 수행 할 수 있습니다. 일반 모드 명령을 사용하는 방법을 배워야한다는 데 동의하지만, 약간의 수정을 위해 삽입 모드에서 백 스페이스를 사용하는 것은 적절하지 않습니다.
Karl Yngve Lervåg

3
@ KarlYngveLervåg, 백 스페이스의 경우 동의합니다 (실제로 스스로 비활성화하지는 않습니다). 그러나 OP에는 백 스페이스의 기본 동작이 있으며 줄 시작과 같이 작동하지 않지만 줄 내에서 작동하는 것처럼 보입니다. 여전히 OP에는 백 스페이스보다 더 나은 옵션이 있습니다. 예를 들어, 이전 줄로 돌아가는 대신 J공백을 처리하는을 사용할 수 있습니다 . 요컨대, 백 스페이스는 작성하는 동안 빠른 오타 수정에 적합하지만 더 나은 대안이 있습니다.
Shahbaz

1
많은 사람들의 문제는 그 기능 자체에 동의하지 않는 것이 아니라 그들이 사용하는 유일한 편집기는 아니라는 것입니다. 여러 편집기를 사용하기 때문에 백 스페이스와 관련된 패러다임을 전환하는 것은 직관적이지 않으므로 vim 기능의 하위 세트를 선호합니다.
j riv

vim-faq를 설치 한 경우 오프라인 답변을 얻을 수 있습니다 : :h vim-faq및 검색 /backspace. 기억하기 어려운 태그는 :h faq-12.26입니다.
Hotschke

답변:


178

tl; dr : vimrc에 이것을 추가하여 대부분의 다른 프로그램에서와 같이 백 스페이스가 작동하도록하십시오.

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은 많은 파일 형식에 대해 자동 들여 쓰기를 추가합니다. 기본적 으로이 공간을 백 스페이스 할 수 없습니다 . '자동 들여 쓰기'로 간주되는 규칙은 약간 미묘합니다 (예 : █가 커서 인 경우).

if :; then
    █

백 스페이싱이 작동하지 않습니다.

우리는 다음 명령과를 추가한다면 fi, 다시 가서, 우리가 하는 들여 쓰기를 제거 할 수 :

if :; then
    █:
fi

Vim은 첫 번째 예에서 Enter 키를 눌렀을 때 1 단계의 들여 쓰기를 추가해야한다고 결정했기 때문입니다. 그러나 두 번째 예에서 Vim은 아무것도 자동 들여 쓰기하지 않았습니다. 탭 문자 또는 공백입니다.

참조 :help 'autoindent'

eol
백 스페이스를 누르면 EOL 마커 ( \n또는 \r\n)가 제거됩니다 . 비활성화 된 경우 EOL 마커를 삭제하려고하면 백 스페이스에서 아무 작업도 수행하지 않습니다.

시작
이 당신이 수 있음을 의미 만을 삽입 모드가 시작된 이후 사용자가 삽입 한 텍스트를 삭제하고 이전에 삽입 된 텍스트를 삭제할 수 없습니다.

기본 설정은 무엇입니까?

Windows에서 GVIM을 사용하는 것으로 나타났습니다. 그러나 대부분의 Linux 시스템에서는 터미널에서 VIM을 사용하는 동안 백 스페이스가 예상대로 작동하는 것 같습니다.

그 이유는 많은 Linux 배포판에 미리 만들어진 vimrc 파일이 포함되어 있기 때문에 일반적인 옵션을 설정하기 때문입니다. 예를 들어 내 아치 리눅스 시스템에서 나는 /usr/share/vim/vimfiles/archlinux.vim:

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

Windows에 Vim을 설치하는 경우 기본적으로 Vim과 함께 제공되는 기본 vimrc 및 gvimrc를 사용합니다.

빔의 기본에 대해 빈 값입니다 backspace. 아치 리눅스, 데비안, CentOS 또는 $other_distro기본값은 다를 수 있습니다.

일반 모드

이 질문은 삽입 모드의 백 스페이스에 관한 것이지만 일반 모드의 백 스페이스에 대한 간단한 설명도 추가하겠습니다.

일반 모드에서 백 스페이스는의 역할 h을하며 왼쪽으로 이동합니다.

(있는 경우 기본적으로 백 스페이스는 경우 행의 시작 부분에서 이전 행으로 이동됩니다 eol에 있었다 backspace) 플래그를 'whichwrap'통해 옵션 으로이 동작을 제어 할 수 있습니다 b(기본적으로 활성화되어 있음).

백 스페이스가 문자를 X명령 에 맵핑하여 문자를 삭제하도록 만들 수도 있습니다 .

nnoremap <BS> X

1
나는 그것이 "_X"보다 자연스러운"행동 이라고 생각합니다 <BS>.
Hauleth

2
기본 동작이있는 배포판은 거의 없습니다. 내가 목격 한 유일한 것은 msys2였으며 아마도 결정이 아니라 저개발의 본질입니다.
j riv

5

<BS>Windows에서 ConEmu를 사용하여 설명 할 수없는 동작을 경험 한 사람이있는 경우에 대비 하여 <BS>키를 다음과 같이 다시 매핑해야 할 수도 있습니다 .

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

추가 정보


1
set backspace=2

v5.4 이하에서 사용됩니다. Mac에서 나를 위해 일했습니다.

Mac에서 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 General Public License v3 (GPLv3)을 사용하는데, Apple은이를지지하지 않습니다. 이것에 대한 레딧에 대한 토론은 여기에 있습니다 .

다음을 사용하여 최신 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.