it-roy-ru.com

вим 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
48
Sangeeth Saravanaraj

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

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

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

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

62
evil otto

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

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

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

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

У меня теперь есть в моем .vimrc:

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

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

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

4
Ryan

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

  • Использование Cygwin с Xterm, под X конечно же :)
  • Ssh'ed к RHEL6.4-> bash-> tmux-> vim

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

3
holms

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

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

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

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

3
Alvin Bunk

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

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

2
dzhi

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

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

на ваш ~/.vimrc.

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

2
Taiki

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

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

In .vimrc, type:      imap ^? ^H

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

2
BRASIL

положить стереть стереть ^? в вашем .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

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

1
Parth

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

1
meetalexjohnson

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

0
8A52

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

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

0
OmaruSensei

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

:set t_kb=^H

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

0
frankster

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

bindkey "^W" backward-delete-Word

С этим :

bindkey "^?" backward-delete-Word
0
Abdelilah Benaou