Nhấn phím mũi tên thêm ký tự trong trình soạn thảo vi


188

Khi tôi cố gắng sử dụng các phím mũi tên trong chế độ chèn trong vitrình chỉnh sửa, các ký tự sau sẽ được chèn vào trình chỉnh sửa:

  • cho tôi nhận B,
  • tôi được A
  • tôi nhận được D,
  • tôi nhận được C.

Xin hãy giúp tôi giải quyết vấn đề này.


3
Tôi đã có một tiếng cười vui vẻ khi đọc tiêu đề;) Tôi chắc chắn có một XKCD cho cảm giác ma quái xuất hiện (với người dùng mới làm quen) khi phím mũi tên in chữ.
vvy

1
Nó rất rất đáng sợ;)
Kyle Bridenstine

Câu trả lời:


233

Nếu bạn chưa có .vimrctệp trong thư mục chính của mình, hãy tạo một tệp bằng cách này:

vim ~/.vimrc

Thêm dòng này vào đầu tập tin:

set nocompatible

Lưu tập tin và điều này sẽ khắc phục vấn đề cho bạn. :)


1
Tôi đã phải tạo một tệp .exrc cho vi, nhưng thiết lập không tương thích hoạt động tốt.
tgun926

25
Có một mẹo nếu bạn sử dụng vithay vì vim, bạn phải thực hiện cùng một cấu hình nhưng trong ~/.exrctệp.
tzi

15
Đã làm việc. Nhưng tại sao sửa chữa này là bắt buộc? Tại sao theo mặc định nó không xử lý các mũi tên?
Mohit

6
Theo mặc định, vi / vim được lập trình để thay thế các phím mũi tên bằng các phím h, j, k, l. Điều này được thực hiện để bạn không phải di chuyển từ khu vực phím chính của bàn phím.
Gaurav Manchanda

10
vấn đề tiếp theo là backspace, giải pháp: Askubfox.com/questions/296385/ trên
daVe

87

Cài đặt vim -> Điều này sẽ khắc phục vấn đề.

sudo apt-get install vim

Có rất nhiều hướng dẫn vim / vi tốt trên youtube, hoặc web nói chung. Đối với vấn đề của bạn, xem ở đây

Sau đó tiếp tục mở tệp như bình thường :

vi desired-file

làm việc cho tôi - mặc dù không chắc tại sao nó khác với vim tôi đã ra mắt trước đây
Amos Folarin

6
Đây phải là câu trả lời được chấp nhận (nhưng dường như không ai chấp nhận). đó là cách đơn giản /
gọn gàng

vâng tôi đồng ý với bạn Lockzsmith, đây không phải là câu trả lời được chấp nhận
niccolo m.

Điều này làm việc cho tôi. Tôi ngạc nhiên rằng raspian đi kèm với phiên bản vi / vim mà nó làm ... mặc dù tất cả các hướng dẫn cho nó đều sử dụng nano, thật khó để tranh luận rằng vim thực sự tốt hơn nó. Có lẽ lý do duy nhất tôi sử dụng vim chứ không phải nano là vì vim luôn có mặt trên mọi máy và có vẻ như cơ hội 50/50 cho dù nano có.
ArtOfWarfare

BLEEPIN 'MÁY TÍNH!
Chris

27

Với vi, khi nhấp vào, ibạn kích hoạt lệnh để Chèn văn bản.
Lệnh này cho phép bạn chèn văn bản trong tệp của bạn.
Và đúng, khi nhấp vào:

  • trên đó sẽ chèn một "A",
  • trên đó sẽ chèn một "B",
  • ...

Cho đến khi bạn hủy kích hoạt lệnh này.
Để hủy kích hoạt lệnh trong vi: chỉ cần nhấp vào Esc
Và sau đó bạn sẽ lấy lại sử dụng bình thường các phím mũi tên của mình:

  • đi lên,
  • đi xuống,
  • ...

FYI, đây là một số vilệnh:
Từ nguồn này .

:xReturn bỏ vi , viết ra tập tin sửa đổi để tập tin có tên trong thỉnh nguyện ban đầu
:wqReturn bỏ vi , viết ra tập tin sửa đổi để tập tin có tên trong thỉnh nguyện ban đầu
:qReturn bỏ (hoặc exit) vi
:q!Return bỏ vi mặc dù thay đổi mới nhất chưa được lưu cho cuộc gọi vi này

di chuyển con trỏ xuống một dòng
di chuyển con trỏ lên một dòng
di chuyển con trỏ sang trái một ký tự
di chuyển con trỏ sang phải một ký tự

u hoàn tác bất cứ điều gì bạn vừa làm; một cách đơn giản để
. làm lại bất cứ điều gì bạn vừa làm

i chèn văn bản trước con trỏ, cho đến khi Escnhấn
I chèn văn bản ở đầu dòng hiện tại, cho đến khi Escnhấn văn bản
a nối sau con trỏ, cho đến khi Escnhấn văn bản
A nối vào cuối dòng hiện tại, cho đến khi Escnhấn
o mở và đặt văn bản vào một dòng mới bên dưới dòng hiện tại, cho đến khi Escnhấn
O mở và đặt văn bản trong một dòng mới trên dòng hiện tại, cho đến khi Escnhấn

r thay thế một ký tự dưới con trỏ (không Esccần thiết)
cw thay đổi từ hiện tại bằng văn bản mới, bắt đầu bằng ký tự dưới con trỏ, cho đến khi Escnhấn
x xóa ký tự đơn dưới con trỏ
Nx xóa N ký tự, bắt đầu bằng ký tự dưới con trỏ
dw xóa từ đơn bắt đầu bằng ký tự
C thay đổi con trỏ (thay thế) các ký tự trong dòng hiện tại, cho đến khi Escnhấn
D xóa phần còn lại của dòng, bắt đầu với vị trí con trỏ hiện tại

dd xóa toàn bộ dòng hiện tại
Ndd xóa N dòng, bắt đầu với dòng hiện tại; ví dụ: 5dd xóa 5 dòng
yy sao chép (yank, cắt) dòng hiện tại vào
Nyy bản sao bộ đệm (yank, cắt) các dòng N tiếp theo, bao gồm cả dòng hiện tại, vào bộ đệm
p dán (các) dòng trong bộ đệm vào văn bản sau dòng hiện tại

0(không) di chuyển con trỏ đến đầu dòng hiện tại (con trỏ có con trỏ)
$ di chuyển con trỏ đến cuối dòng hiện tại
w di chuyển con trỏ đến đầu từ tiếp theo
b di chuyển con trỏ trở lại đầu từ trước
:0Returnhoặc 1G di chuyển con trỏ đến dòng đầu tiên trong tệp
:nReturnhoặc nG di chuyển con trỏ đến dòng n
:$Returnhoặc G di chuyển con trỏ đến dòng cuối cùng trong tệp

/string tìm kiếm về phía trước sự xuất hiện của chuỗi trong
?string tìm kiếm văn bản ngược về sự xuất hiện của chuỗi trong văn bản
n di chuyển đến lần xuất hiện tiếp theo của chuỗi tìm kiếm
N di chuyển đến sự xuất hiện tiếp theo của chuỗi tìm kiếm theo hướng ngược lại


28
Phím mũi tên xuống chèn "B" không phải là hành vi dự kiến. Các phím mũi tên phải được di chuyển con trỏ lên xuống / trái và phải bất kể chế độ chèn.
James Wong

2
@JamesWong Trên thực tế, đó hành vi được mong đợi, vì đó là cách Vi được lập trình ban đầu. VIM, (không chính thức) là người kế nhiệm Vi, theo chế độ tương thích với Vi theo mặc định, bao gồm hành vi này cho các phím mũi tên. Vì vậy, từ "nên" ở đây chỉ mang tính chủ quan, vì VIM thực sự đang làm những gì nó được lập trình có chủ đích để làm.
Villapx

2
@villapx - Không, đó không phải là hành vi mong đợi. Hành vi dự kiến ​​được xác định bởi những gì người dùng thông thường của bạn mong đợi. Người điển hình sử dụng vi / vim đang sử dụng nó bởi vì đó là những gì được cài đặt trên máy chủ mà họ cần nhanh chóng định cấu hình và họ sẽ không làm đủ để bận tâm với việc cài đặt một cái gì đó khác. Rất ít người thực sự chọn sử dụng vim khi được cung cấp một tùy chọn và thực tế ít biết tất cả các tính năng hoặc quirks này. Người dùng thông thường mong đợi mũi tên di chuyển con trỏ - đó là hành vi dự kiến. Bất cứ điều gì khác là hành vi bất ngờ, và nên được viết thành một lỗi cho mức độ bất ngờ của nó.
ArtOfWarfare

@ArtOfWarfare Bạn có thể tự do định nghĩa "mong đợi" theo cách bạn chọn. Tôi đang xác định nó là những gì mà tác giả của mã mong đợi, vì chúng khá rõ ràng trong hướng dẫn VIM về cách thức hoạt động của nó ... từ :help compatible: "Theo mặc định, tùy chọn này được bật và mặc định Vi được sử dụng cho tùy chọn. Mặc định này được chọn cho những người muốn sử dụng Vim giống như Vi và thậm chí không (muốn) biết về tùy chọn 'tương thích'. "
Villapx

@ArtOfWarfare Về cơ bản, tác giả VIM rõ ràng có một đối tượng cụ thể trong tâm trí khi viết phần mã này và chỉ vì đối tượng đó khác với đối tượng của bạn , không có nghĩa đó là lỗi. Bạn có thể gửi nó như một lỗi nếu bạn muốn, nhưng hãy chuẩn bị để bị mắng bởi những người theo trào lưu chính thống VIM (và thực sự là bất kỳ ai tôn trọng 'hướng dẫn', một người hâm mộ RTFM).
Villapx

17

Để vô hiệu hóa in chữ khi nhấn mũi tên trong chế độ chỉnh sửa, bạn có thể làm như sau

vi $HOME/.exrc 

(tạo tập tin nếu nó không tồn tại) và sau đó thêm dòng set nocompatiblevào nó và lưu lại.


Tôi đặt nó trong .vimrc. Tại sao bạn đặt nó trong .exrc?
pauljohn32

Cả hai nguồn Vim - xem đầu ra của :versionthứ tự tải (cũng :h .exrchoặc :h init). Tôi cho rằng ai đó có thể muốn một cài đặt áp dụng trong cả vi và vim, hoặc có thể là một thói quen tuyệt đối.
William Robertson

11

Có ba chế độ trong vi soạn thảo là:

  • chế độ lệnh
  • Chế độ đầu vào
  • chế độ mặc định.

Khi bạn mở một tập tin, bạn đang ở chế độ mặc định. Bây giờ nếu bạn muốn đi đến một vị trí cụ thể trong văn bản của bạn, chỉ cần sử dụng các phím mũi tên hoặc sử dụng h, j, k, lphím. Lưu ý rằng điều này sẽ chỉ làm việc khi bạn chưa ép i(hoặc bất kỳ chế độ đầu vào khác vào lệnh như a, A, I).

Lý do cho 'B' có thể là do các phím mũi tên ở chế độ đầu vào không hoạt động như các phím mũi tên, vì vậy chỉ cần nhấn Escđể chuyển sang chế độ mặc định bất cứ lúc nào. Khi chuyển sang chế độ đầu vào báo chí ihay a, và để di chuyển chỉ cần nhấn iphím quan trọng và sử dụng mũi tên hoặc h, j, k, l.


7

Tôi đã có cùng một vấn đề nhưng không chỉ trên máy cục bộ của tôi mà còn về các kết nối thông qua putty trên máy sles trong máy ảo Win7 qua máy thu citrix. Cả máy chủ cục bộ và máy chủ từ xa đều hiển thị sau khi cài đặt lại Ubuntu có cùng một vấn đề.

Sau khi phát hiện ra rằng

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

Gây ra hành vi VI kỳ lạ này, tôi đã cài đặt gói dữ liệu bảng điều khiển để giải quyết vấn đề!

sudo apt-get install console-data

3

Ghi chú:

Có thông tin tốt trong các bài viết khác nhưng không có bài viết nào cố gắng giải thích tại sao hành vi này xảy ra. Nhiều người chắc chắn sẽ vấp ngã trong tương lai này. Ngoài ra, bạn có thể đánh dấu câu hỏi này là đã được giải quyết vì bất kỳ bài đăng nào trước đây có thể hỗ trợ bạn không?


Đây là một lời giải thích :

Vi là một trình soạn thảo đã có từ rất lâu, với nguồn gốc từ các hệ thống Unix. Đó là một công cụ tốt nhưng nó đã được lặp đi lặp lại và bây giờ thì tốt hơn. Vim đã được viết sau đó và đó là lặp đi lặp lại. Mọi người thường gọi vi là 'vim-Minimal' và vim là phiên bản "cải tiến" của vi. Bạn có thể nghĩ về nó như thế này: vi là cốt lõi và vim mở rộng trên nó.

Có khả năng bạn phát hiện ra hành vi :

Để bạn phát hiện ra vấn đề này, bạn nhấn " i " để vào chế độ chèn và sau đó sử dụng các phím mũi tên để điều hướng đúng dòng và chỉnh sửa điểm. Đây là những gì gây ra vấn đề char bất ngờ của bạn.

Giải pháp 1 hoặc 2

1) vi someFileTrong khi sử dụng vi , trước tiên hãy di chuyển đến điểm chỉnh sửa, sau đó vào chế độ chèn.

2) vim someFileĐơn giản chỉ cần sử dụng vim từ đầu.

Tôi không thể nhấn mạnh đủ để đọc hướng dẫn (trang nam) hoặc sử dụng -h để được giúp đỡ. Khi bạn điều chỉnh các mẫu trong trình bao, các trang man sẽ trở thành người bạn tốt nhất của bạn. Ví dụ: man vihoặcman vim


Xác thực rằng Vim đã được cài đặt .

Mở một cửa sổ giao diện điều khiển và thực hiện:

dpkg --list | grep vim

Nếu bạn nhận được một cái gì đó tương tự như vậy, thì bạn có thể bắt đầu sử dụng 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

Nếu dấu nhắc lệnh trả về không có gì, thì vim không được cài đặt. Sử dụng các ví dụ dưới đây để cập nhật kho lưu trữ của bạn và sau đó cài đặt vim.

sudo apt-get update
sudo apt-get install vim

Nếu bạn chỉ sử dụng vi hoặc vim khi tìm kiếm trên internet cách khắc phục điều gì đó và bạn quên không gõ vim, có một cách bạn có thể khắc phục trong tương lai. Tôi cảnh báo bạn phải chú ý. Bạn có thể sử dụng một bí danh để ghi đè vi với tham chiếu đến vim để cho dù bạn nhập gì trong tương lai không thường xuyên, bạn sẽ nhận được vim mà không có "oops!" chốc lát. Bạn luôn có thể xóa một bí danh sau này.

Loại vim .bashrc. Di chuyển xuống dòng trống chỉ có một ~(hoặc bất kỳ dòng nào khác bắt đầu bằng alias(vì vậy chúng được nhóm lại với nhau) và sau đó nhấn phím i để vào chế độ -insert- Trên dòng riêng của nó, hãy nhập như sau:

alias vi='vim'

Nhấn Escvà sau đó gõ :wq. Bây giờ bạn cần tải lại tập tin. Nhập source .bashrcBất kỳ shell nào khác mở sau khi bạn thực hiện các chỉnh sửa này sẽ tự động tải tệp .bashrc.


3

Tất cả những lời giải thích được đưa ra là một chút kỳ quái. Tôi có vi nhưng chưa cài đặt vim.

Kiểm tra thay thế: /etc/alternatives/vi/usr/bin/vim.tiny

Vì vậy, vivim.tiny, và nó sử dụng /etc/vim/vimrc.tiny.

Và trong vimrc.tinybạn tìm thấy dòng sau:

set compatible

Đó gần như là điều duy nhất trong tập tin này. Lưu ý rằng trong /etc/vim/vimrcnó đang sử dụng nocompatible.

Vì vậy, hoặc cài đặt vim, hoặc thay đổi vimrc.tinytệp, hoặc tạo tệp của riêng bạn ~/.vimrcnên chứa dòng:

set nocompatible

1
Tôi không chắc những gì kỳ quái. Cuối cùng, bạn đề xuất 1. cài đặt Vim - askubfox.com/a/220072/158442 , 2. tạo ~/.vimrcvà cài đặt nocompatible: askubfox.com/a3533944/158442 hoặc 3. chỉnh sửa tệp hệ thống. Chỉ có gợi ý để chỉnh sửa /etc/vim/vimrc.tinylà mới, nhưng bạn gọi những câu trả lời kỳ quái trong khi đề xuất điều tương tự như chúng.
muru

1

Trình chỉnh sửa vi truyền thống không nhận ra các phím mũi tên (... afair). Có hai giải pháp:

  1. sử dụng vim thay vì vi
  2. sử dụng h, j, k và l để điều hướng (bạn không thể điều hướng trong khi chỉnh sửa trên vi btw truyền thống.)

Điều này không đúng. Tìm các ứng dụng dựa trên terminfo / termcap và libcurses. Tôi sử dụng vi từ năm 1990 trong Xenix, SCO Unix, AIX, hpux cũ và các loại khác và vi-thuần từ thập niên 80 đã hỗ trợ ánh xạ terminfo / termcap.
Luciano

@ james-wong tốt thì tôi nên viết lại câu trả lời của mình. Để "vi tinh khiết dưới Ubuntu không ..."
madmike

... và điều này có ý nghĩa như một bình luận cho @luciano
MadMike

1

Điều này cũng có thể là do TERMbiến; đặt ví dụ như thế này:

 export TERM=xterm

Điều này đã giải quyết vấn đề cho tôi khi các câu trả lời khác không có. Cảm ơn!
greg

1

Trên một số hệ thống, các nocompatibletùy chọn không có sẵn, hoặc nó có thể không giải quyết được vấn đề nếu bị vỡ cắm mũi tên các chức năng chính. Đây là một cách giải quyết ...

Chỉnh sửa .exrctệp để bao gồm các dòng sau:

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

Hoặc, nếu sự cố chỉ tồn tại ở chế độ bình thường, bạn có thể thay đổi nmapvà bỏ qua những điều sau đây a, như sau:

nmap! ^[OA ^[k

vân vân

Đây là các kết hợp chính cần thiết để sản xuất chúng (chỉ hiển thị đầu tiên):

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

Điều này thoát khỏi chế độ chỉnh sửa, di chuyển theo hướng mong muốn và bật lại chế độ chỉnh sửa. Điều này là cần thiết để khắc phục Vi đọc chuỗi thoát như một chuỗi chữ <ESC> <O> <A>, v.v.

Nguồn: https://apse-www.harvard.edu/~fine/Tech/vi.html


1

Đối với VI, hãy tạo hoặc chỉnh sửa tệp "~ / .exrc" hoặc VIM tạo hoặc chỉnh sửa tệp "~ / .vimrc" được đặt hoặc thêm vào dòng.

set nocompatible

Tại thời điểm viết bài này, có những lời khen ngợi về hạng mục được bình chọn nhiều thứ hai đang tự hỏi tại sao mục nhập của họ không được chấp nhận. Lý do là có những máy chủ không cho phép cài đặt các trình soạn thảo khác. Thậm chí sau đó vim đôi khi có các hiệu ứng tương tự, vì vậy có một loạt các thông tin có thể sử dụng từ hai mục hàng đầu. Tôi không thể bình luận tuy nhiên hy vọng điều này làm sáng tỏ lý do tại sao không ai đúng 100% 100% thời gian.


0

Trên máy tính này tôi phải make suređó

set nocompatible

last entry in ~/.vimrc. Hoặc ít nhất một trong những mục cuối cùng, đặc biệt là không có thêm plugin nào được tải sau đó.

HTH


0

Vì một số lý do, Ubuntu đã bỏ qua việc khởi tạo envvar HOME cho người dùng root trên VPS 18.04 mới của tôi. Nếu đó là trường hợp, vi không thể tìm thấy tệp .vimrc. Vấn đề không xảy ra đối với người dùng bình thường (trong / nhà /).

Để kiểm tra biến:

echo $HOME

Nếu điều này dẫn đến một dòng trống, biến không được đặt. Vấn đề đã biến mất sau

export HOME=/root

Tôi đã chuyển lệnh vào tệp /root/.bashrc (Tôi không biết nơi này thường được đặt).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.