Нажатие клавиш со стрелками добавляет символы в редактор vi


188

Когда я пытался использовать клавиши со стрелками в режиме вставки в viредакторе, в редакторе вставлялись следующие символы:

  • потому что ↓я получаю B,
  • потому что ↑я получаю,
  • потому что ←я получил D,
  • ибо →я получаю C.

Пожалуйста, помогите мне в решении этой проблемы.


3
Я посмеялся над заголовком;) Я уверен, что есть XKCD для жуткого чувства, которое возникает (для начинающих пользователей), когда клавиша со стрелкой печатает буквы.
— вв

1
Это очень очень страшно;)
— Кайл Бриденстайн

Ответы:


233

Если у вас еще нет .vimrcфайла в вашем домашнем каталоге, создайте его с помощью этого:

vim ~/.vimrc

Добавьте эту строку в начало файла:

set nocompatible

Сохраните файл, и это должно решить проблему для вас. :)


1
Мне пришлось создать файл .exrc для vi, но набор nocompatible работал отлично.
— tgun926

25
Существует хитрость, если вы используете viвместо vim, вы должны сделать ту же конфигурацию, но в ~/.exrcфайле.
— Ци

15
Работал. Но почему это исправление требуется? Почему по умолчанию он не обрабатывает стрелки?
— Мохит

6
По умолчанию vi / vim запрограммирован для замены клавиш со стрелками на клавиши h, j, k, l. Это сделано для того, чтобы вам не пришлось уходить из области основных клавиш клавиатуры.
— Гаурав Манчанда

10
Следующая проблема Backspace, решение: askubuntu.com/questions/296385/...
— Дэйв

87

Установите vim -> Это решит проблему.

sudo apt-get install vim

На youtube или в Интернете есть много хороших уроков по vim / vi. По вашей проблеме смотрите здесь

Затем продолжайте открывать файлы как обычно :

vi desired-file

работал для меня - хотя не уверен, почему это отличается от VIM, который я запускал ранее
— Амос Фоларин

6
Это должен быть принятый ответ (но кажется, что никто не принимает). это самый простой / чистый способ полностью модернизировать vim для компьютерной консоли (вместо терминалов эпохи tty / ANSI.
— Lockszmith

да, я согласен с вами, Lockzsmith, это должен был быть принятый ответ
— niccolo m.

Это сработало для меня. Я удивлен, что raspian поставляется с версией vi / vim, которая у него есть ... хотя во всех уроках для него сказано, что вы должны использовать nano, что трудно утверждать, что vim действительно лучше, чем он. Вероятно, единственная причина, по которой я использую vim, а не nano, заключается в том, что vim всегда есть на каждой машине, и кажется, что вероятность 50/50 равна nano.
— ArtOfWarfare

BLEEPIN 'КОМПЬЮТЕР!
— Крис

27

При viнажатии на кнопку iвы активируете команду Вставить текст.
Эта команда позволяет вам вставить текст в ваш файл.
И правильно, при нажатии:

  • на ↑нем будет вставлена ​​буква "А",
  • на ↓нем будет вставлена ​​буква "B",
  • ...

Пока вы не отключите эту команду.
Чтобы деактивировать команду в vi: просто нажмите Esc
И тогда вы вернетесь к обычному использованию клавиш со стрелками:

  • ↑ подняться,
  • ↓ спускаться,
  • ...

К вашему сведению, вот несколько viкоманд:
Из этого источника .

:xReturn выйти из vi , записать измененный файл в файл, названный в исходном вызове,
:wqReturn выйти из vi , записать измененный файл в файл, названный в исходном вызове,
:qReturn выйти (или выйти) vi
:q!Return выйти из vi, даже если последние изменения не были сохранены для этого вызова vi

↓ переместить курсор вниз на одну строку
↓ переместить курсор вверх на одну строку
← переместить курсор влево на один символ
→ переместить курсор вправо на один символ

u отменить все, что вы только что сделали; простое переключение
. повтора все, что вы только что сделали

i вставлять текст перед курсором, пока не Escнажмете
I вставить текст в начале текущей строки, пока не Escнажмете
a добавить текст после курсора, пока не Escнажмете
A добавить текст в конец текущей строки, пока не Escнажмете
o open и не поместите текст в новую строку ниже текущей строки, пока не Escнажмете
O open и поместить текст в новую строку над текущей строкой, пока не будет Escнажата

r заменить один символ под курсором (не Escтребуется)
cw изменить текущее слово новым текстом, начиная с символа под курсором, до Escнажатия
x удалить один символ под курсором
Nx удалить N символов, начиная с символа под курсором
dw удалить одно слово, начинающееся с символа при
C изменении курсора (заменить) символы в текущей строке, пока не Escнажмете
D удалить остаток строки, начиная с текущей позиции курсора

dd удалить всю текущую строку
Ndd удалить N строк, начиная с текущей строки; например, 5dd удаляет 5 строк,
yy копирует (yank, cut) текущую строку в буфер и
Nyy копирует (yank, cut) следующие N строк, включая текущую строку, в буфер,
p вставляет строки в буфере в текст после текущая строка

0(ноль) переместить курсор в начало текущей строки (курсор с курсором)
$ переместить курсор в конец текущей строки
w переместить курсор в начало следующего слова
b переместить курсор назад в начало предыдущего слова
:0Returnили 1G переместить курсор в первую строку файла
:nReturnили nG переместить курсор в строку n
:$Returnили G переместить курсор на последнюю строку в файле

/string поиск вперед для вхождения строки в текстовом
?string поиске назад для вхождения строки в текстовом
n движении к следующему вхождению строки поиска
N двигаться к следующему вхождению строки поиска в обратном направлении


28
Стрелка вниз при вставке «B» не является ожидаемым поведением. Клавиши со стрелками должны перемещать курсоры вверх и вниз / влево и вправо независимо от режима вставки.
— Джеймс Вонг

2
@JamesWong На самом деле, это ожидаемое поведение, поскольку это как Vi был изначально запрограммирован. VIM, (неофициально) преемник Vi, по умолчанию находится в Vi-совместимом режиме, который включает это поведение для клавиш со стрелками. Таким образом, слово «должен» здесь просто субъективно, поскольку VIM фактически делает то, для чего оно было специально запрограммировано.
— villapx

2
@villapx - Нет, это не ожидаемое поведение. Ожидаемое поведение определяется тем, что ожидает ваш типичный пользователь. Обычный человек, использующий vi / vim, использует его, потому что это то, что установлено на сервере, которое им нужно быстро настроить, и они не будут делать достаточно, чтобы потрудиться с установкой чего-то другого. Мало кто на самом деле решает использовать vim, когда ему дают опцию, и немногие на самом деле знают все эти функции или причуды. Типичный пользователь ожидает, что стрелки будут перемещать курсор - это ожидаемое поведение. Все остальное является неожиданным поведением и должно быть записано как ошибка, как неожиданное.
— ArtOfWarfare

@ArtOfWarfare Вы можете определить «ожидаемый», как вы выберете. Я определяю это как то, что ожидается от автора кода, так как в руководстве VIM было совершенно ясно, как это должно себя вести ... from :help compatible: «По умолчанию эта опция включена, и значения по умолчанию Vi используются для параметры. Это значение по умолчанию было выбрано для тех людей, которые хотят использовать Vim точно так же, как Vi, и даже не хотят (хотят) знать о «совместимой» опции ».
— villapx

@ArtOfWarfare По сути, автор VIM явно имел в виду определенную аудиторию, когда писал эту часть кода, и то, что эта аудитория отличается от той, которая была бы у вашей аудитории, не означает, что это ошибка. Вы можете подать его как ошибку, если хотите, но будьте готовы к тому, что вас будут ругать фундаменталисты VIM (и, на самом деле, любой, кто уважает «руководство», как поклонники RTFM).
— villapx

17

Чтобы отключить печать букв при нажатии стрелок в режиме редактирования, вы можете сделать следующее

vi $HOME/.exrc 

(создайте файл, если он не существует), а затем добавьте set nocompatibleв него строку и сохраните.


Я положил это в .vimrc. Почему вы положили его в .exrc?
— pauljohn32

Оба источника Vim - см. Выход :versionдля порядка загрузки (также :h .exrcили :h init). Я предполагаю, что кто-то может захотеть применить настройку в vi и vim, или это может быть просто сила привычки.
— Уильям Робертсон

11

В редакторе vi есть три режима:

  • командный режим
  • режим ввода
  • режим по умолчанию.

Когда вы открываете файл, вы находитесь в режиме по умолчанию. Теперь , если вы хотите , чтобы перейти к определенной позиции в тексте, просто используйте клавиши со стрелками или использования h, j, k, lключи. Обратите внимание , что это будет работать только тогда , когда вы не нажали i(или любой другой режим ввода ввода команды , как a, A, I).

Причина «B» может заключаться в том, что клавиши со стрелками в режиме ввода не функционируют как клавиши со стрелками, поэтому просто нажмите, Escчтобы в любой момент перейти в режим по умолчанию. Когда для перехода в режим ввода нажмите iили a, а также для навигации просто нажмите iклавиши ключ и используйте стрелки или h, j, k, l.


7

У меня была точно такая же проблема, но не только на моей локальной машине, но и на соединениях через замазку на машине sles в виртуальной машине Win7 через приемник citrix. Как локальный, так и удаленный хосты показывают, что после переустановки Ubuntu возникла точно такая же проблема.

Узнав, что

$ localectl list-keymaps 
Couldn't find any console keymaps.

Вызывает странное поведение VI. Я установил пакет console-data, который решает проблему!

sudo apt-get install console-data

3

Примечание:

В других сообщениях есть хорошая информация, но ни один из них не пытался объяснить, почему это произошло. Многие люди будут сталкиваться с этим в будущем. Кроме того, не могли бы вы пометить этот вопрос как решенный, так как любой из предыдущих постов, вероятно, помог вам?


Вот объяснение :

Vi - редактор, который существует уже давно, его корни уходят в системы Unix. Это хороший инструмент, но он был повторен, и теперь он стал лучше. Vim был написан позже и это итерация. Люди обычно называют vi «vim-minimal», а vim - «улучшенная» версия vi. Вы можете думать об этом так: vi - это ядро, а vim расширяет его.

Вероятно, как вы обнаружили поведение :

Чтобы вы обнаружили эту проблему, вы нажали « i », чтобы войти в режим вставки, а затем с помощью клавиш со стрелками переместились по правильной линии и отредактировали точку. Это то, что вызвало неожиданную проблему с символами.

Решение 1 или 2

1) vi someFileПри использовании vi сначала перейдите к точке редактирования, затем войдите в режим вставки.

2) vim someFileПросто используйте vim с самого начала.

Я не могу выделить достаточно, чтобы прочитать руководство (справочные страницы) или использовать -h для помощи. Как только вы подстроитесь под шаблоны в оболочке, man-страницы станут вашим лучшим другом. Пример: man viилиman vim


Убедитесь, что Vim установлен .

Откройте окно консоли и выполните:

dpkg --list | grep vim

Если вы получили что-то похожее на это, тогда вы можете просто начать использовать vim.

~ $ dpkg --list | grep vim
ii  vim         2:7.4.052-1ubuntu3  amd64  Vi IMproved - enhanced vi editor
ii  vim-common  2:7.4.052-1ubuntu3  amd64  Vi IMproved - Common files
ii  vim-runtime 2:7.4.052-1ubuntu3  all    Vi IMproved - Runtime files
ii  vim-tiny    2:7.4.052-1ubuntu3  amd64  Vi IMproved - enhanced vi editor - compact version

Если командная строка возвращает ничего, vim is не установлен. Используйте приведенные ниже примеры для обновления ваших репозиториев, а затем установите vim.

sudo apt-get update
sudo apt-get install vim

Если вы используете vi или vim только при поиске в Интернете, как что-то исправить, и вы случайно забыли напечатать vim, есть один способ исправить это в будущем. Я предупреждаю вас обратить внимание. Вы можете использовать псевдоним, чтобы перезаписать vi ссылкой на vim, чтобы независимо от того, что вы печатаете в нечастом будущем, вы получаете vim без этого "упс!" момент. Вы всегда можете удалить псевдоним позже.

Тип vim .bashrc. Переместитесь вниз к пустой строке только с ~(или любой другой строкой, которая начинается с alias(поэтому они сгруппированы вместе), а затем нажмите клавишу i, чтобы войти в -insert- mode. В отдельной строке введите следующее:

alias vi='vim'

Нажмите, Escа затем введите :wq. Теперь вам нужно перезагрузить файл. Введите source .bashrcЛюбая другая оболочка, которая открывается после внесения этих изменений, автоматически загрузит файл .bashrc.


3

Все объяснения немного странные. Я установил vi, но не установил vim.

Проверка альтернатив: /etc/alternatives/vi→/usr/bin/vim.tiny

Так viесть vim.tiny, и это использует /etc/vim/vimrc.tiny.

И vimrc.tinyвы найдете следующую строку:

set compatible

Который является почти единственным в этом файле. Обратите внимание, что в /etc/vim/vimrcнем используется nocompatible.

Так что либо установите vim, либо измените vimrc.tinyфайл, либо создайте свой собственный, ~/.vimrcкоторый должен содержать строку:

set nocompatible

1
Я не уверен, что это так странно. В итоге вы предлагаете: 1. установить Vim - askubuntu.com/a/220072/158442 , 2. создать ~/.vimrcи настроить nocompatible: askubuntu.com/a/353944/158442 или 3. редактировать системный файл. Только предложение изменить /etc/vim/vimrc.tinyявляется новым, и все же вы называете ответы странными, предлагая то же самое, что и они.
— Муру

1

Традиционный редактор vi не распознает клавиши со стрелками (... в воздухе). Есть два решения:

  1. используйте vim вместо vi
  2. используйте h, j, k и l для навигации (вы не можете перемещаться во время редактирования на традиционном vi-btw.)

Это не правда Ищите приложения на базе terminfo / termcap и libcurses. Я использую vi с 1990 года в Xenix, SCO Unix, AIX, старом hpux и других, а pure-vi из 80-х уже поддерживает отображения terminfo / termcap.
— Лучано

@ Джеймс-Вонг, тогда я должен перефразировать мой ответ. «
— Чистому

... и это подразумевалось как комментарий к @luciano
— MadMike

1

Это также может быть связано с TERMпеременной; установите это, например, так:

 export TERM=xterm

Это решило проблему для меня, где другие ответы не сделали. Спасибо!
— Грег

1

В некоторых системах эта nocompatibleопция недоступна или может не решить проблему, если плагин нарушает функциональность клавиш со стрелками. Вот обходной путь ...

Отредактируйте .exrcфайл, включив в него следующие строки:

map! ^[OA ^[ka
map! ^[OB ^[ja
map! ^[OC ^[la
map! ^[OD ^[ha

Или, если проблема существует только в обычном режиме, вы можете перейти к следующему nmapи пропустить следующее a:

nmap! ^[OA ^[k

и так далее.

Вот комбинации клавиш, необходимые для их создания (показаны только первые):

map! <CTRL-V><Up-Arrow> <CTRL-V><ESC>ka

Это выходит из режима редактирования, перемещается в нужном направлении и возвращается в режим редактирования. Это необходимо для преодоления Vi, читающего escape-последовательность как последовательность литералов <ESC> <O> <A> и т. Д.

Источник: https://hea-www.harvard.edu/~fine/Tech/vi.html


1

Для ВП создайте или отредактируйте файл "~ / .exrc" или VIM создайте или отредактируйте файл "~ / .vimrc", установите или добавьте в строку.

set nocompatible

На момент написания этой статьи есть похвалы по второму пункту с наибольшим количеством голосов, которые задаются вопросом, почему их запись не была принята. Причина в том, что существуют хосты, которые не позволяют устанавливать другие редакторы. Даже тогда vim иногда имеет одинаковые эффекты, поэтому из двух первых записей есть куча полезной информации. Однако я не могу комментировать, надеюсь, это проясняет причины, почему ни один из них не является 100% правильным в 100% случаев.


0

На этой машине мне пришлось make sureчто то

set nocompatible

это last entry in ~/.vimrc. Или, по крайней мере, одна из последних записей, в частности, больше не загружается плагин.

НТН


0

По какой-то причине Ubuntu пропустил инициализацию envvar HOME для пользователя root на моем новом 18.04 VPS. Если это так, vi не может найти файл .vimrc. Проблема не возникает для обычных пользователей (в / home /).

Чтобы проверить переменную:

echo $HOME

Если это приводит к пустой строке, переменная не установлена. Проблема ушла после

export HOME=/root

Я переместил команду в файл /root/.bashrc (я не знаю, где это обычно устанавливается).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.