Чому клавіша зворотної області не працює в режимі вставки?


146

Спроба видалити символи у режимі вставки за допомогою backspaceклавіші іноді, здається, не працює. Я можу backspace іноді , але в інший час це нічого не робить; курсор не йде ліворуч, і абсолютно нічого, здається, не відбувається.

Я помітив це за допомогою gVim у Windows. backspace, Здається, працює , як очікувалося при використанні Vim з терміналу в більшості систем Linux , однако.

  1. Чому це відбувається?
  2. Як я можу змусити backspaceклавіші видалити символи як завжди?
  3. Чи така поведінка задумана як особливість? Іншими словами: чи є кращі альтернативи backspaceвидаленню символів у режимі вставки?

Хоча відповідь, подана нижче, правильно вирішує вашу проблему, я виявив, що відключення ключів, таких як клавіші зі стрілками або зворотній простір, допомагають звикнути робити більш правильно. Backspace in vim виконується за допомогою X(і видалення за допомогою x), але часто те, що ви дійсно хотіли зробити, це, dbнаприклад, видалити до початку слова, або dawвидалити ціле слово тощо. Якщо у вас є резервна область, ви ризикуєте використовувати це субоптимальний ключ у більшості випадків, ніж потрібно.
Шахбаз

5
@Shahbaz Я не погоджуюся: перебуваючи у режимі вставки, має сенс мати незначні виправлення, використовуючи клавішу зворотної області. Я погоджуюся, що слід навчитися користуватися командами звичайного режиму, але це непровершене використання зворотного простору в режимі вставки для незначних виправлень.
Карл Інгве Лервег

3
@ KarlYngveLervåg, у випадку зворотного простору я погоджуюся (насправді я не відключаю його). Однак, схоже, що в ОП є поведінка за замовчуванням заднім простором, яка не працює, наприклад, з початком рядка, але працює в межах лінії. Тим не менше, OP має кращі варіанти, ніж зворотна область. Наприклад, замість того, щоб повернути попередній рядок, ви можете використовувати, Jякий також піклується про пробіли. Коротше кажучи, зворотний простір чудово підходить для швидкого виправлення помилок під час написання, але крім того, що є кращі альтернативи.
Шахбаз

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.

То що саме ці значення означають?

відступ
Vim додає автоматичне відступ для багатьох файлів; за замовчуванням, ви НЕ дозволили забій з цього приводу; правила того, що вважається «автоіндикацією», є дещо витонченими, наприклад, якщо ми введемо це (де █ - курсор):

if :; then
    █

Резервне копіювання не буде працювати.

Але якби ми потім додати команди і fi, і повернутися, ми які дозволили видалити відступ:

if :; then
    █:
fi

Це тому, що в першому прикладі Vim визначив, що він повинен додати 1 рівень відступу при натисканні клавіші Enter; але у другому прикладі Vim нічого не задав, це лише символи Tab або кілька пробілів.

Також див :help 'autoindent'

eol
Це має бути найбільш очевидним, натискання Backspace також видаляє маркери EOL ( \nабо \r\n); якщо він відключений, Backspace нічого не зробить, якщо ви спробуєте видалити маркер EOL.

start
Це означає, що ви можете видалити лише текст, який ви вставили з моменту запуску режиму вставки, і ви не можете видалити будь-який текст, який раніше був вставлений.

То яка настройка за замовчуванням?

Я помітив це за допомогою GVIM у Windows. Здається, зворотний простір працює як очікувалося при використанні VIM з терміналу в більшості систем Linux.

Причиною цього є те, що багато дистрибутивів 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.

За замовчуванням 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 у мене є 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 не підтримує. Дискусія про Reddit про це тут .

Ви можете оновити до найновішого Bash за допомогою:

brew install bash

це дозволяє скористатись програмним завершенням, висвітленим тут .


0

Якщо set backspace=indent,eol,startостанній ваш рядок vimrc, жодне з рішень не працюватиме.

Після цього додайте ще одне правило, наприклад:

set ruler

4
Мені це здається досить дивним, чи можете ви пояснити, чому додавання іншої команди до вашого vimrc призведе до того, що попередня буде працювати?
statox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.