点击箭头键在 vi 编辑器中添加字符

bvb*_*bvb 265 text-editor vi

当我尝试在vi编辑器的插入模式下使用箭头键时,编辑器中插入了以下字符:

  • 因为?我得到 B,
  • 因为?我得到 A,
  • 因为?我得到了 D,
  • 因为?我得到了 C。

请帮我解决这个问题。

Gau*_*nda 307

如果您.vimrc的主目录中还没有文件,请使用以下命令创建一个文件:

vim ~/.vimrc
Run Code Online (Sandbox Code Playgroud)

将此行添加到文件的顶部:

set nocompatible
Run Code Online (Sandbox Code Playgroud)

保存文件,这应该会为您解决问题。:)

  • 如果你使用 `vi` 而不是 `vim`,有一个技巧,你必须在 `~/.exrc` 文件中进行相同的配置。 (33认同)
  • 工作了。但是为什么需要此修复程序?为什么默认情况下它不处理箭头? (18认同)
  • 下一个问题是退格,解决方案:http://askubuntu.com/questions/296385/backspace-in-insert-mode-in-vi-doesnt-erase-the-character (18认同)
  • 默认情况下,vi/vim 被编程为用键 h、j、k、l 替换箭头键。这样做是为了让您不必离开键盘的主要按键区域。 (6认同)
  • 我必须为 vi 创建一个 .exrc 文件,但 set nocompatible 效果很好。 (2认同)

小智 142

安装vim软件包将解决问题:

sudo apt-get install vim
Run Code Online (Sandbox Code Playgroud)

YouTube 或网络上有许多很好的 vim/vi 教程。对于您的问题,请参阅文章8 Essential Vim Editor Navigation Fundamentals

然后继续像往常一样打开文件:

vi desired-file
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案(但似乎没有人接受)。这是将 vim 完全“现代化”到计算机控制台(而不是 tty/ANSI 时代终端)的最简单/最干净的方法。 (7认同)
  • 为我工作 - 虽然不确定为什么这与我之前启动的 vim 不同 (2认同)

Bor*_*ris 27

使用vi,按下i时激活命令以插入文本。
此命令允许您在文件中插入文本。
没错,当:

  • 按下?它会插入一个“A”,
  • 按下?它会插入一个“B”,
  • ...

直到您停用此命令。
要停用命令vi:只需按Esc
然后您将恢复正常使用箭头键:

  • ? 上去,
  • ? 往下走,
  • ...

仅供参考,这里有一些vi命令:
来自这个来源

`:x` Return**退出 vi**,将修改后的文件写入原始调用中命名的文件
`:wq` Return**退出 vi**,将修改后的文件写入原始调用中命名的文件
`:q` Return**quit (或退出) vi**
`:q!` Return**退出 vi**,即使此 vi 调用的最新更改尚未保存
**移动**光标向下一行**向上移动**光标一行**移动** 光标左移一个字符**移动** 光标右移一个字符 `u` **撤销**你刚才所做的一切;一个简单的切换 `.` **redo** 无论你刚刚做了什么 `i` **insert** 文本在光标之前,直到 在当前行的开头点击`I` **insert** 文本,直到 ?
?
?
?


Esc
Esc点击
`a` **append** 文本在光标后,直到Esc点击
`A` **append** 文本到当前行的末尾,直到Esc点击
`o` **open** 并将文本放在当前行下方的新行中,直到Esc点击
`O` **open** 并将文本放在当前行上方的新行中,直到Esc点击
`r` **replace** 光标下的单个字符(Esc不需要)
`cw` **更改**当前单词使用新文本,从光标下的字符开始,直到Esc点击
`x` **删除**光标下的单个字符
`Nx` **删除** N 个字符,从光标下的字符开始
`dw` **删除**以光标下字符
`C`开头的单个单词**更改**(替换)当前行中的字符,直到Esc点击
`D` **删除**行的剩余部分,从当前光标位置开始
`:0` `dd` **删除**整个当前行
`Ndd` **删除** N 行,从当前行开始;例如,5dd 删除 5 行
`yy` **copy**(yank, cut)当前行到缓冲区
`Nyy` **copy**(yank, cut)接下来的 N 行,包括当前行,到缓冲区缓冲区
`p` **将缓冲区中的行粘贴**到当前行之后的文本中
`0`(零)**移动**光标到当前行的开头(带有光标的行)
`$ ` **move** 光标到当前行的结尾
`w` **move** 光标到下一个单词的
开头光标回到前一个单词的开头
Return或 `1G` **move** 光标到文件中的第一行
`:n`Return或 `nG` **move** 光标到第 n 行
`:$`Return或 `G` **move** 光标到最后一行文件
`/string` **搜索** 在文本
`?string` 中出现字符串 **搜索** 在文本
`n` 中出现字符串**移动** 到搜索字符串
` N` 的下一次出现**移动**到下一个相反方向的搜索字符串

  • 向下箭头键插入“B”不是预期的行为。无论插入模式如何,箭头键都应上下/左右移动光标。 (33认同)
  • @JamesWong 实际上,这是 _is_ 预期的行为,因为这就是 Vi 最初的编程方式。VIM(非正式地)是 Vi 的后继者,默认情况下处于 Vi 兼容模式,其中包括箭头键的这种行为。所以这里的“应该”这个词只是主观的,因为 VIM 实际上正在做它有目的地编程要做的事情。 (3认同)
  • @villapx - 不,这不是预期的行为。预期行为由典型用户的预期定义。使用 vi/vim 的典型人正在使用它,因为这是他们需要快速配置的服务器上安装的东西,他们不会做足够的事情来安装其他东西。在给出选项时,很少有人真正选择使用 vim,而真正了解所有这些功能或怪癖的人则更少。典型的用户期望箭头移动光标——这是预期的行为。其他任何事情都是意外行为,应该将其写成一个错误,说明它是多么出乎意料。 (3认同)
  • @ArtOfWarfare 你可以自由地定义“预期”,无论你选择什么。我将其定义为代码作者所期望的,因为他们在 VIM 手册中非常清楚地说明了它应该如何表现......来自`:help兼容`:“默认情况下此选项处于打开状态并且Vi默认值用于选项。这个默认值是为那些想要像 Vi 一样使用 Vim 的人选择的,甚至不(不想)了解“兼容”选项。” (2认同)

Ani*_*kur 23

要在编辑模式下按箭头禁用打印字母,您可以执行以下操作

vi $HOME/.exrc 
Run Code Online (Sandbox Code Playgroud)

(如果文件不存在,则创建文件),然后set nocompatible向其中添加行并保存。


小智 11

vi 编辑器共有三种模式,分别是:

  • 命令模式
  • 输入模式
  • 默认模式。

当您打开文件时,您处于默认模式。现在,如果您想转到文本中的特定位置,只需使用箭头键或使用h, j, k,l键。请注意,这仅在您没有按下i(或任何其他输入模式输入命令,如a, A, I)时才有效。

'B' 的原因可能是因为输入模式下的方向键不具有方向键的功能,所以只要按一下Esc就可以进入默认模式。何时切换到输入模式按ia,导航只需按i键并使用箭头键 或hjkl


kit*_*ris 7

我有完全相同的问题,但不仅在我的本地机器上,而且在通过 citrix 接收器的 Win7 VM 中的 sles 机器上通过腻子连接。重新安装 Ubuntu 后,本地主机和远程主机都显示完全相同的问题。

得知后

$ localectl list-keymaps 
Couldn't find any console keymaps.
Run Code Online (Sandbox Code Playgroud)

导致这种奇怪的VI行为我安装了解决问题的包console-data!

sudo apt-get install console-data
Run Code Online (Sandbox Code Playgroud)


小智 6

这是一个解释

Vi是一个已经存在了很长时间的编辑器,其根源可以追溯到 Unix 系统。这是一个很好的工具,但它已经被迭代了,现在有更好的了。Vim是后来写的,就是那个迭代。人们通常将 vi 称为“vim-minimal”,而 vim 是 vi 的“改进”版本。你可以这样想:vi 是核心,vim 在它上面进行扩展。

可能你是如何发现这种行为的

为了让您发现这个问题,您按“ i ”进入插入模式,然后使用箭头键导航正确的行和编辑点。这就是导致您意外的字符问题的原因。

解决方案 1 或 2

  1. vi someFile使用vi 时,先移动到编辑点,然后进入插入模式。

  2. vim someFile只需从一开始就使用vim

我不能强调阅读手册(手册页)或使用 -h 寻求帮助。一旦你适应了 shell 中的模式,手册页就会成为你最好的朋友。示例:man viman 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
Run Code Online (Sandbox Code Playgroud)

如果命令提示符什么也没有返回,则表示未安装 vim。使用以下示例更新您的存储库,然后安装 vim。

sudo apt-get update
sudo apt-get install vim
Run Code Online (Sandbox Code Playgroud)

如果您仅在互联网上搜索如何修复某些内容时才使用 vi 或 vim 并且碰巧忘记键入vim,则有一种方法可以为将来修复它。我提醒你要注意。您可以使用别名通过对 vim 的引用来覆盖 vi,这样无论您在不频繁的将来键入什么,您都可以获得 vim,而不会出现“哎呀!” 片刻。您以后可以随时删除别名。

键入vim .bashrc。向下移动到只有 a 的空行~(或以 开头的任何其他行alias(因此它们被组合在一起),然后按i键进入 -insert- 模式。在单独的行上,输入以下内容:

alias vi='vim'
Run Code Online (Sandbox Code Playgroud)

Esc然后键入:wq。现在您需要重新加载文件。键入source .bashrc您所做后,这些修改会自动加载.bashrc文件打开任何其他外壳。


小智 5

这也可能是由于TERM变量造成的;像这样设置它:

export TERM=xterm
Run Code Online (Sandbox Code Playgroud)