[求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

Vim、Emacs配置和使用
回复
头像
Patrick_DJ
帖子: 110
注册时间: 2010-08-15 8:46

[求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#1

帖子 Patrick_DJ » 2014-06-23 11:10

例如vim中有下面的文本:

- 命名依然是ks
- 使用自制2D图形库,实现基本功能,预留API。
- 不打算使用句柄对象,但要想办法避免引用到野指针(参考cocos2dx的actions_manager);或者是参考ogre3d里的使用统一创建器和析构器的方式。
- 使用字符串属性配置,类似html里的style,减少代码初始化行数。
- 使用注册的方式来针对单个对象进行自定义它的draw、on、step。

然后我想搜索“注册”二字总共出现了多少次,就用vim的搜索命令":%s/注册//gn',其中"注册"二字需要打开输入法去输入。

但是如果我搜索的内容比较长,用输入法挨个去写就挺麻烦的。

想当然地用vim的visual模式去选中想要统计的文本(如“注册"二字),然后按y键复制到vim自己的剪贴板中。但是当我在“命令模式"下输入:%s/,然后按p键的时候并不能把剪贴板中的内容(也就是“注册”二字)复制出来,期望的是:%s/注册,但实际结果是:%s/p。

请问大家有什么办法么?~ 0_0

另外我用的是freebsd系统,在vim里使用:reg命令,输出结果里没有"+这个寄存器,而是只有"、0-9、j、-、:、%、/。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#2

帖子 eexpress » 2014-06-23 11:42

鼠标选择。输入s/后,中键粘贴就是啊。
● 鸣学
头像
Patrick_DJ
帖子: 110
注册时间: 2010-08-15 8:46

Re: [求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#3

帖子 Patrick_DJ » 2014-06-23 11:51

eexpress 写了:鼠标选择。输入s/后,中键粘贴就是啊。
谢谢解答~ :D

不过因为我在vim里wrap的,并且vsplit了第2窗口,同时要搜索的内容是刚好是在单行的自动换行的位置(也是跨了屏幕的两行)。如果是用鼠标的话就会把另一个窗口的内容也选中了~ 0_0

或者说是在控制台没有鼠标和输入法的情况下,是否可以实现 [ 在vim文本里复制内容用于vim命令(如%s)的参数 ] ?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#4

帖子 eexpress » 2014-06-23 11:58

先yank,然后命令模式下,ctrl-r " 粘贴。
● 鸣学
头像
Patrick_DJ
帖子: 110
注册时间: 2010-08-15 8:46

Re: [求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#5

帖子 Patrick_DJ » 2014-06-23 12:06

eexpress 写了:先yank,然后命令模式下,ctrl-r " 粘贴。
上述方法完美解决了我的问题,非常感谢~ :D
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: [求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#6

帖子 YeLee » 2014-06-23 12:39

斌婶好腻害,进来学习了。 :em11
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: [求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#7

帖子 sarrow » 2014-06-29 19:46

我也来贴贴自己的方法;

function! g:CollectMatch(line1, line2, pattern)
" FIXME
" 有点小问题:当查找的串只有一个字母时,将出现死循环——因为光标没有移动的
" 问题;需要在每次找到匹配后,后移一次光标。
" 这个 "后移一次" 也是个麻烦——normal l的话,在行末,光标不会移动。用
" normal w的话,又可能错过数据。Orz。
" NOTE:
" 使用%s//\=Function_of_collect/ge
" 上面的这种方法肯定能行——缺点——就算你实际没有让subs前后的buffer内容有
" 什么不同,但是vim也会认为做了修改!
" 另外一个变通的仿佛就是使用
" /
" 来 search。
let _current_line_ = line(".")
let _ret_ = {}
let _reg_q_ = getreg('"')
call setreg('+', '')
"let @+ = ''
let _v_str_ = []
execute a:line1
while search(a:pattern, 'cW', a:line2) > 0
normal ma
call search(a:pattern, 'cWe', a:line2)
normal mb
normal `av`by
let _key_ = @"
if !has_key(_ret_, _key_)
let _ret_[_key_] = 1
call add(_v_str_, _key_)
else
let _ret_[_key_] += 1
endif
normal `b
endwhile

for key in _v_str_
let @+ .= string(_ret_[key]) . "\t" . key . "\n"
endfor
"for key in sort(keys(_ret_))
" let @+ .= string(_ret_[key]) . "\t" . key . "\n"
"endfor
echom 'collected '.len(_v_str_).' item(s).'
call setreg('"', _reg_q_)
execute _current_line_
endfunction

" TODO
"command! -nargs=? -range=% -complete=custom,CollectPreDefined Collect call g:CollectMatch(<line1>, <line2>, <q-args>)
command! -nargs=? -range=% Collect call g:CollectMatch(<line1>, <line2>, <q-args>)

=======================

声明,有缺陷,不能收集只包含一个字符的模式!

使用很简单,附加到.vimrc下,支持行范围,供命令行调用

如,统计链接:

:'<,'>Collect "\zs\<http:.\{-}\ze"
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: [求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#8

帖子 sarrow » 2014-06-29 19:48

饿。理解错误。楼主的需求重点是“寄存器用法”,而不是“统计次数”。
头像
noble_out
帖子: 150
注册时间: 2012-04-20 15:58
系统: ubuntu12.04+windows8
来自: 中华人民共和国
联系:

Re: [求助]如何在vim文本里复制内容用于vim命令(如%s)的参数?

#9

帖子 noble_out » 2014-08-05 10:18

CTRL+0比CTRL+r"
好用,后者得CTRL+r SHIFT+"
:em04
回复