Vim Backspace оставляет ^? - PullRequest
51 голосов
/ 14 марта 2012

В 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~, а для 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

Ответы [ 14 ]

64 голосов
/ 17 апреля 2012

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

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

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

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

5 голосов
/ 11 апреля 2014

Из 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 в gvim. Сделайте в системе то, что вы не можете заставить ключ работать должным образом, поэтому он вставляет ключ возврата, который видит проблемный сеанс.

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

if &term == "xterm-256color"
  set t_kb=^?
endif
4 голосов
/ 18 апреля 2012

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

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

3 голосов
/ 07 ноября 2017

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

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

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

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

3 голосов
/ 23 августа 2017

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

Я создал статью по этому вопросу здесь:

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

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

3 голосов
/ 12 апреля 2014

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

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

In .vimrc, type:      imap ^? ^H

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

3 голосов
/ 02 августа 2013

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

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

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

2 голосов
/ 07 августа 2018

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

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

1 голос
/ 03 мая 2016

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

1 голос
/ 28 ноября 2013

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

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

...