vim backspace оставляет ^?

В Vim, когда я нажимаю клавишу backspace в режиме insert, он оставляет символ ^? и не удаляет символ, который должен быть удален.

У меня есть следующее в моем .vimrc

syntax on
set number
set expandtab
set incsearch
set nocompatible
set backspace=indent,eol,start
fixdel

Это происходит и в командном режиме. Когда я неправильно набираю W вместо w для сохранения, я нажимаю клавишу backspace и получаю следующее:

:W^?

Любая идея о том, что не так и как это исправить?!

ОБНОВЛЕНИЕ: прежде чем опубликовать этот вопрос в SO, я выполнил базовый поиск в Google и попробовал все предложения с первой страницы результатов поиска, но безуспешно.

@strcat Я использую vim версии 7.0.237, консоль KDE 1.6.4, машину Linux 2.6.18 x86_64.

@graywh w.r.t cat -v, для удаления я получаю ^[[3~, а для возврата я получаю ^?.

Вывод stty -a выглядит следующим образом

speed 38400 baud; rows 38; columns 194; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

person Sangeeth Saravanaraj    schedule 14.03.2012    source источник
comment
Пожалуйста, перейдите по ссылке ниже, чтобы решить проблему: › vim.wikia.com/wiki/Backspace_and_delete_problems РЕДАКТИРОВАТЬ: я нашел то, что похоже на проблему, похожую на описанную вами: › lj4newbies.blogspot.com/2007/05/   -  person Bogdan Emil Mariesan    schedule 14.03.2012
comment
Извините, я пробовал это, но не сработало!   -  person Sangeeth Saravanaraj    schedule 14.03.2012
comment
я обновил свой пост с некоторыми новыми советами, пожалуйста, пересмотрите их   -  person Bogdan Emil Mariesan    schedule 14.03.2012
comment
какой терминал / ОС вы используете?   -  person strcat    schedule 15.03.2012
comment
Что печатается в cat -v, когда вы нажимаете клавиши Delete и Backspace? Каков ваш результат от stty -a?   -  person graywh    schedule 15.03.2012
comment
Здесь совершенно не по теме, может быть хорошим вопросом для суперпользователя или unix.stackexchange   -  person Ben Voigt    schedule 17.04.2012
comment
@strcat Я использую vim версии 7.0.237, консоль KDE 1.6.4, машину Linux 2.6.18 x86_64.   -  person Sangeeth Saravanaraj    schedule 18.04.2012
comment
У меня это произошло при изменении настроек qTerminal путем изменения эмуляции терминала с default на linux.   -  person Pulathisi Bandara    schedule 14.02.2020


Ответы (14)


^? — символ удаления; символ возврата — ^H. Только один из них распознается вашим терминалом как "стирание", и это определяется настройками терминала, stty. (bash и другие оболочки понимают это как проблему и делают специальные вещи, чтобы распознать и то, и другое)

Если ваш эмулятор терминала (ssh, putty, xterm, что угодно) не соответствует настройкам вашего терминала, вы увидите это поведение. Обычно это правильно по умолчанию, но очень часто люди помещают stty команды в свой .bashrc, что нарушает работу.

У вас, вероятно, есть что-то вроде stty erase ^H в вашем bashrc. Если вы это сделаете, избавьтесь от него или измените настройки терминала, чтобы Backspace отправлял ^H вместо DEL (^?)

Вы также можете исправить это с помощью сопоставлений vim, но при этом игнорируется основная проблема.

person evil otto    schedule 17.04.2012
comment
Ты прав. Это stty в моем файле bashrc, который все испортил. Спасибо за разъяснения. - person Sangeeth Saravanaraj; 18.04.2012
comment
Случилось с несколькими людьми здесь, использующими шпатлевку на unix (не linux), в шпатлевке это легко исправить, заменив pref-›terminal-›keyboard-›backspace на ^H - person j03m; 02.05.2014
comment
Что делает stty erase ^? 2>/dev/null? - person User; 17.03.2015
comment
У меня нет stty в моем vim. - person User; 30.03.2015
comment
Я хочу добавить, что если у вас нет «stty» в вашем файле .bashrc и вы видите эту проблему... тогда добавьте «stty» в ваш файл .bashrc, и эта проблема исчезнет. stty erase '^?' - person rrlamichhane; 07.01.2017
comment
Похоже на противоречивый совет. Некоторые говорят, что нужно добавить команду stty в ваш .bashrc, а другие советуют удалить ее. - person Michael Mathews; 11.01.2017
comment
evil otto - я тоже сталкивался с этим, но у меня нет ничего в моих .bashrc или подобных файлах конфигурации, которые регулируют настройки stty. Вместо этого я могу воспроизвести это в macOS, используя find . -type f -name "foo" | xargs vim, а затем попытаться найти что-то в Vim, используя /. В этот момент при нажатии Backspace появляется ^?. Но если я нажму Backspace, удерживая клавишу Fn, он работает правильно. Кроме того, после выхода из Vim оболочка не позволяет мне видеть символы, которые я ввожу, поэтому мне приходится вслепую набирать reset<CR>. Если вместо этого я использую vim $(find ...), то клавиша возврата и оболочка работают правильно. Есть идеи, почему? - person Gordonium; 17.04.2018

Попробуйте добавить:

noremap! <C-?> <C-h>

к вашему ~/.vimrc.

Это карты C-? на backspace, и сработало для меня.

person Taiki    schedule 07.11.2017

Из vim wiki Backspace_and_delete_problems я продолжил читать :help :fixdel, это предполагает следующее:

if &term == "termname"
  set t_kb=^V<BS>
  fixdel
endif

Где "^V" — это сочетание клавиш CTRL-V, а "" — клавиша возврата
(не вводите четыре символа!). Замените "termname"
именем вашего терминала.

Для меня fixdel заставляет backspace работать как удаление. Моя первая ошибка заключалась в том, что я также выполнял возврат CTRL-V в gvim, делая в системе, что вы не можете заставить ключ работать должным образом, поэтому он вставляет ключ возврата, который видит проблемный сеанс.

Теперь у меня в .vimrc:

if &term == "xterm-256color"
  set t_kb=^?
endif
person Morgan    schedule 11.04.2014

Хорошим решением этой проблемы является установка настроек «Терминал > Клавиатура» для сопоставления клавиши Backspace с «Control-H» в PuTTY; Это если вы используете PuTTY и испытываете "^?" проблема с нажатием клавиши Backspace.

Я создал статью об этом здесь:

https://alvinbunk.wordpress.com/2017/08/23/vi-or-vim-using-backspace-inserts/

Спасибо @j03m за предложение!

person Alvin Bunk    schedule 23.08.2017
comment
Я потратил бесчисленное количество часов, пытаясь исправить это, и это помогло мне, спасибо - person wundermahn; 29.04.2020
comment
Рад, что это помогло! - person Alvin Bunk; 29.04.2020

Попробуйте ctrl+del/ctrl+backspace или alt+del /alt+backspace, я не помню какой, но я думаю, что это поможет вам.

Если это не сработает, попробуйте shift+backspace/del. Я сталкивался с этой проблемой раньше, есть комбинированная клавиша, которую вы можете нажать, чтобы отправить правильный код символа для удаления.

person Ryan    schedule 18.04.2012

Была точно такая же проблема, за исключением того, что у меня не работало Ctrl+H. stty настройки тоже в порядке. Просто хочу упомянуть мою среду, если у кого-то возникнут такие же проблемы:

  • Использование cygwin с xterm, конечно, под X :)
  • Отправка по Ssh на RHEL6.4->bash->tmux->vim

После добавления fixdel к .vimrc все работает! Все исправления выше не работали для меня.

person holms    schedule 02.08.2013
comment
Я тоже... использую превышение ---› SSH --- › RHEL › ksh › tmux › vim - person statquant; 22.11.2013

У меня была такая же проблема, когда vim backspace оставляет ^?, а в командной строке он работал правильно.

Это то, что сработало для меня, используя сопоставление vim:

In .vimrc, type:      imap ^? ^H

Это сопоставит CTRL-H (который является клавишей возврата по умолчанию в vim) на клавишу возврата. Надеюсь, это поможет.

person BRASIL    schedule 12.04.2014
comment
Я не мог понять, как заставить работать символ ^H, поэтому вместо этого я сделал: imap ^? ‹BS› в файле .vimrc, и теперь он работает нормально. cmap также необходим для команд и поиска. - person horta; 02.03.2016
comment
у меня работала модификация horta, а ^H - нет: imap ^? ‹БС› - person Steve Bond; 06.07.2017

На Mac, если вы используете терминал, перейдите в «Настройки» -> «Профили» -> «Дополнительно», затем выберите «Удалить отправки Control-H».

person Choylton B. Higginbottom    schedule 03.05.2016
comment
Я вечно пробовал другие решения, но это помогло мне на Mac, ура! - person Aaron Robeson; 17.05.2018

поместите stty erase ^? в свой .bashrc

Запустите файл .bashrc

запустить команду: stty -a

speed 38400 baud; rows 48; columns 157; line = 0;
intr = ^C; quit = ^\; ***erase = ^?***; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Стирание теперь будет изменено с новым значением ^?, и ваш возврат теперь будет работать.

person Parth    schedule 28.11.2013

Этот ответ сработал для меня: http://vim.wikia.com/wiki/Backspace_and_delete_problems

По сути, размещение set backspace=2 в .vimrc работает.

person dzhi    schedule 07.08.2018
comment
Это сработало и для меня. Просто и по делу. Единственное, я поместил свои изменения в глобальную конфигурацию vim в /etc/vimrc (отредактировано с помощью sudo) - person Avrdan; 21.02.2019

Если вы используете KDE, я знаю эту боль. Это наиболее полное решение, которое я нашел на данный момент http://www.yalla.nu/blog/post/86

person 8A52    schedule 30.05.2014

У меня была эта проблема, и я нашел следующую настройку в моем .vimrc:

:set t_kb=^H

Удаление этой строки решило проблему.

person frankster    schedule 14.03.2016

В FreeBSD с CSH вы должны заменить это в вашем .cshrc:

bindkey "^W" backward-delete-word

С этим :

bindkey "^?" backward-delete-word
person Abdelilah Benaou    schedule 10.07.2018

Для меня это была проблема stty, у меня был такой же вывод stty -a, как и у вас.
Это было исправлено для меня, запустив stty sane.

Это не только решило проблему возврата/удаления, но также исправило клавиши со стрелками.

person OmaruSensei    schedule 15.05.2019