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

时间:2012-11-19 02:15:13

标签: vim

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

示例:

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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

虽然格雷格的回答很明显,但我已经修改了我的 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