寻找一种简单的方法来复制上面的单词并将其粘贴到 Vim 中的当前光标位置

I'm*_*gon 6 vim

我想知道是否有命令可以直接复制光标上方的字符或单词并将其粘贴到当前位置?

例子:

sig1   : in   std_logic;
sig2   : in   std_logic;
sig3   : ^
Run Code Online (Sandbox Code Playgroud)

考虑上面的情况,我的光标在^位置,我想复制in std_logic;并粘贴到当前位置。我所知道的一种可行的方法是:

1. Move cursor up
2. Go into visual mode and highlight
3. Yank
4. Move cursor down
5. Paste
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来做到这一点?或者我只能选择在 vimrc 中编写一个映射来为我执行整个序列?

编辑:我在互联网上找到了一个映射:

imap <F1> @<Esc>kyWjPA<BS>
nmap <F1> @<Esc>kyWjPA<BS>
imap <F2> @<Esc>kvyjPA<BS>
nmap <F2> @<Esc>kvyjPA<BS>
Run Code Online (Sandbox Code Playgroud)

但似乎格雷格的解决方案更容易!

Gre*_*ill 6

在插入模式下,您可以使用Ctrl+Y从上一行的相应字符位置复制字符。只需按住键并等待键盘重复即可让您到达行尾。


Pet*_*ker 5

尽管 Greg 的回答是正确的,但我已经修改了我的ctrl+y以逐字复制,因为我发现它对我的工作流程更有帮助。我的~/.vimrc文件中有以下内容:

inoremap <expr> <c-y> pumvisible() ? "\<c-y>" : matchstr(getline(line('.')-1), '\%' . virtcol('.') . 'v\%(\k\+\\|.\)')
Run Code Online (Sandbox Code Playgroud)

基本上,如果插入完成菜单(请参阅 参考资料:h ins-completion-menu)不可见,则此表达式映射会复制上一行中的单词。检查这种情况允许接受当前完成并离开完成模式(请参阅 参考资料:h complete_CTRL-Y)。

如果插入完成菜单不可见,则会发生以下情况:

  • getline(line('.')-1) 返回上一行
  • virtual('.') 当前位置列位置
  • '\%' . virtcol('.') . 'v\%(\k\+\\|.\)' 从光标位置匹配一个单词或任何字符
  • matchstr() 返回与模式匹配的前一行的匹配部分。

如需更多帮助,请参阅:

:h :map-<expr>
:h pumvisible(
:h matchstr(
:h getline(
:h line(
:h virtcol(
:h /\%v
:h /\k
Run Code Online (Sandbox Code Playgroud)