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

188

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

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

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

BVB
источник
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
sthysel
источник
работал для меня - хотя не уверен, почему это отличается от 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.

ps_cool
источник
7

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

Узнав, что

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

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

sudo apt-get install console-data
kitingChris
источник
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.

D75
источник
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
Gunstick
источник
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.)
MadMike
источник
Это не правда Ищите приложения на базе 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% случаев.

tuxdalinuxpenguin
источник
0

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

set nocompatible

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

НТН

Gen.Stack
источник
0

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

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

echo $HOME

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

export HOME=/root

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

Erik
источник