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>

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

4

2 回答 2

11

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

于 2012-11-19T02:19:18.290 回答
6

尽管 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
于 2012-11-19T03:46:04.497 回答