Подтвердить что ты не робот

Vim backspace leaves ^?

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

В моем .vimrc

есть следующее:
syntax on
set number
set expandtab
set incsearch
set nocompatible
set backspace=indent,eol,start
fixdel

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

:W^?

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

UPDATE: перед отправкой этого вопроса в SO, я выполнил базовый поиск в Google и пробовал все предложения с первой страницы результата поиска, но безуспешно.

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

@graywh w.r.t cat -v, для delete, я получаю ^[[3~ и для backspace я получаю ^?.

Вывод 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
4b9b3361

Ответ 1

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

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

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

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

Ответ 3

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

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

Где "^ V" - это CTRL-V, а "- это обратный пробел
(не вводите четырех символов!). Заменить" termname"
с именем вашего терминала.

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

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

if &term == "xterm-256color"
  set t_kb=^?
endif

Ответ 4

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

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

Ответ 5

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

  • Использование cygwin с xterm, под X of the course:)
  • Ssh'ed to RHEL6.4 → bash → tmux- > vim

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

Ответ 6

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

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

In .vimrc, type:      imap ^? ^H

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

Ответ 7

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

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

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

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

Ответ 8

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

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

на ваш ~/.vimrc.

Это отображает C-? для backspace, и работал у меня.

Ответ 10

поставьте 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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

:set t_kb=^H

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

Ответ 14

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

bindkey "^W" backward-delete-word

С этим:

bindkey "^?" backward-delete-word

Ответ 15

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

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