Натискання клавіш зі стрілками додає символи у редакторі vi


188

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

  • бо ↓я отримую B,
  • бо ↑я отримую A,
  • бо ←я отримую D,
  • бо →я отримую С.

Будь ласка, допоможіть мені вирішити цю проблему.


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

1
Це дуже страшно;)
— Кайл Бріденштейн

Відповіді:


233

Якщо у вас ще немає .vimrcфайлу у вашому домашньому каталозі, створіть його за допомогою цього:

vim ~/.vimrc

Додайте цей рядок у верхню частину файлу:

set nocompatible

Збережіть файл, і це має вирішити проблему. :)


1
Мені довелося створити .exrc файл для vi, але набір несумісних працював чудово.
— tgun926

25
Існує хитрість, якщо ви використовуєте viзамість цього vim, ви повинні зробити ту саму конфігурацію, але у ~/.exrcфайлі.
— ци

15
Працювали. Але чому це виправлення потрібно? Чому за замовчуванням він не обробляє стрілки?
— Мохіт

6
За замовчуванням vi / vim запрограмований на заміну клавіш зі стрілками клавішами h, j, k, l. Це робиться, щоб вам не довелося рухатись від основної клавіатурної області клавіатури.
— Гаурав Манчанда

10
наступна проблема - це зворотний простір
— daVe

87

Встановити vim -> Це виправить проблему.

sudo apt-get install vim

На ютубі чи в Інтернеті є багато хороших навчальних посібників з vim / vi. Про вашу проблему дивіться тут

Потім продовжуйте відкривати файли, як зазвичай :

vi desired-file

працював на мене - хоча не впевнений, чому це відрізняється від vim, який я
— запускав

6
Це має бути прийнятою відповіддю (але, схоже, ніхто не приймає). це найпростіший / найчистіший спосіб отримати vim повністю «модернізований» до консолі комп'ютера (замість терміналів епохи tty / ANSI.
— Lockszmith

так, я згоден з вами Локзсмітом, це має бути прийнятою відповіддю
— niccolo m.

Це працювало для мене. Я здивований, що raspian постачається з версією vi / vim, яку він робить ... хоча всі підручники для нього говорять про використання нано, що важко стверджувати, що vim насправді кращий за нього. Мабуть, єдина причина, що я використовую vim, а не нано, це те, що vim завжди є на кожній машині, і, здається, шанс 50/50 є нано.
— ArtOfWarfare

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

27

При viнатисканні на кнопку iви активуєте команду Вставити текст.
Ця команда дозволяє вставити текст у файл.
І правильно, натискаючи:

  • на ↑ній буде вставлено "A",
  • на ↓ній буде вставлено "B",
  • ...

До деактивації цієї команди.
Щоб вимкнути команду в vi: просто натисніть на Esc
І тоді ви отримаєте нормальне використання своїх клавіш зі стрілками:

  • ↑ йти вгору,
  • ↓ спуститися,
  • ...

FYI, ось кілька viкоманд:
З цього джерела .

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

↓ переміщення курсору вниз по одному рядку
↓ переміщення курсору вгору на одну лінію
← переміщення курсору вліво одного символу
→ переміщення курсору праворуч на один символ

u скасувати все, що ви тільки що зробили; простий перемикач
. повторює все, що тільки що ви робили

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

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

dd видалити весь поточний рядок
Ndd видалити N рядків, починаючи з поточного рядка; наприклад, 5dd видаляє 5 рядків
yy копіювати (вибивати, вирізати) поточний рядок у буферній
Nyy копії (вибивати, вирізати) наступні 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 їм було цілком зрозуміло, як це має поводитися ... з :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

У мене була та сама проблема, але не тільки на моїй локальній машині, але і підключеннях через шпаклівку на слюсовій машині в Win7 VM через ресивер citrix. Як місцевий хост, так і віддалений хости показують після перевстановлення Ubuntu, була точно така ж проблема.

Після того як це з’ясували

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

Викликає таку дивну поведінку VI, я встановив дані консолі пакета, що вирішує проблему!

sudo apt-get install console-data

3

Примітка:

В інших публікаціях є гарна інформація, але жоден з публікацій не намагався пояснити, чому така поведінка сталася. Багато людей неодмінно натрапляють на це в майбутньому. Також ви могли б позначити це питання як вирішене, оскільки будь-який з попередніх дописів, ймовірно, допомагав вам?


Ось пояснення :

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

Ймовірно, як ви виявили свою поведінку :

Для того, щоб ви виявили цю проблему, ви натиснули " i ", щоб увійти в режим вставки, а потім використали клавіші зі стрілками для навігації по правильному рядку та редагуванню точки. Саме це спричинило вашу несподівану проблему із чарами.

Рішення 1 або 2

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

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

Я не можу наголосити, щоб прочитати посібник (довідкові сторінки) або використовувати -h для допомоги. Після того, як ви пристосуєтесь до шаблонів оболонки, сторінки чоловіка стають вашим найкращим другом. Приклад: 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 не встановлюється. Скористайтеся наведеними нижче прикладами, щоб оновити свої сховища та встановити vim.

sudo apt-get update
sudo apt-get install vim

За винятком випадків, коли ви використовуєте vi або vim лише під час пошуку в Інтернеті, як щось виправити, і ви забули набрати текст vim, є один із способів виправити це на майбутнє. Я застерігаю вас звернути увагу. Ви можете використовувати псевдонім, щоб перезаписати vi з посиланням на vim, так що незалежно від того, що ви введете в нечастому майбутньому, ви отримаєте vim без цього "ой!" мить. Ви завжди можете видалити псевдонім пізніше.

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

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нове, і все ж ви називаєте відповіді химерними, пропонуючи те саме, що і вони.
— muru

1

Традиційний редактор vi не розпізнає клавіші зі стрілками (... afair). Є два рішення:

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

Це неправда. Шукайте програми на основі terminfo / termcap та libcurses. Я використовую vi з 1990 року в Xenix, SCO Unix, AIX, старому hpux та інших, а pure-vi з 80-х вже підтримують терміни / termincap відображення.
— Лучано

@ james-wong добре, тоді я повинен перефразувати свою відповідь. "Чистий vi під Ubuntu не ..."
— MadMike

... і це малося на увазі як коментар до @luciano
— MadMike

1

Це також може бути пов'язано зі TERMзмінною; встановіть його наприклад так:

 export TERM=xterm

Це вирішило проблему для мене там, де інших відповідей не було. Дякую!
— greg

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 зчитування послідовності відходу як послідовності буквального <ESC> <O> <A> тощо.

Джерело: https://hea-www.harvard.edu/~fine/Tech/vi.html


1

Для VI створіть або відредагуйте файл "~ / .exrc" або VIM, створіть або відредагуйте файл "~ / .vimrc", встановіть або додайте у рядку.

set nocompatible

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


0

На цій машині мені довелося це make sureзробити

set nocompatible

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

HTH


0

Чомусь Ubuntu опустив ініціалізацію envvar HOME для користувача root на моїй новій 18.04 VPS. Якщо це так, vi не може знайти файл .vimrc. Проблема не виникає для звичайних користувачів (в / вдома /).

Щоб перевірити змінну:

echo $HOME

Якщо це призведе до порожнього рядка, змінна не встановлюється. Проблема пішла після

export HOME=/root

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.