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

8
我想知道是否有一个命令可以直接复制光标上方的字符或单词,并将其粘贴到当前位置?
例如:
sig1   : in   std_logic;
sig2   : in   std_logic;
sig3   : ^

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

1. Move cursor up
2. Go into visual mode and highlight
3. Yank
4. Move cursor down
5. Paste

有没有更简单的方法?或者我只能在vimrc中编写一个映射来执行整个序列吗?
编辑: 我在网上找到了一个映射:
imap <F1> @<Esc>kyWjPA<BS>
nmap <F1> @<Esc>kyWjPA<BS>
imap <F2> @<Esc>kvyjPA<BS>
nmap <F2> @<Esc>kvyjPA<BS>

但是看起来Greg的解决方案更简单!
2个回答

13
在插入模式下,您可以使用Ctrl+Y从前一行相应字符位置复制字符。只需按住该键并等待键盘重复,即可将光标移动到当前行的末尾。

太棒了!使用Vim十年,我从来没有听说过这个! - Prince Goulash

7

虽然Greg的答案很到位,但我将ctrl+y修改为逐词复制,因为我发现在我的工作流中更有帮助。我在我的~/.vimrc文件中添加了以下内容:

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

基本上,这个表达式映射会在插入完成菜单(参见: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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接