[英]Create a mapping for Vim's command-line that escapes the contents of a register before inserting it
假設我有這樣的文檔,我想搜索URL的所有出現:
Vim resources: [http://example.com/search?q=vim][q]
...
[q]: http://example.com/search?q=vim
我不想完整地輸入它,所以我將光標放在第一個URL上,然后運行"uyi[
將它拖入'u'寄存器。現在要搜索它,我想要只需運行以下命令即可將該寄存器的內容粘貼到搜索字段中:
/\V<c-r>u<CR>
這導致Vim搜索字符串'http:' - 因為'/'字符終止了搜索字段。
我可以通過運行它來解決問題:
/\V<c-r>=escape(@u, '\/')<CR><CR>
但這是很多打字!
如何為Vim的命令行創建一個簡化此工作流程的映射?
我理想的工作流程將是這樣的:
/\\V
鍵調出搜索提示,並使用非常無意義的模式 <Esc>
將取消) 試試這個:
cnoremap <c-x> <c-r>=<SID>PasteEscaped()<cr>
function! s:PasteEscaped()
" show some kind of feedback
echo ":".getcmdline()."..."
" get a character from the user
let char = getchar()
if char == "\<esc>"
return ''
else
let register_content = getreg(nr2char(char))
return escape(register_content, '\/')
endif
endfunction
順便說一句,知道(如果你還沒有)可能有用的東西是你可以使用的東西?
作為分隔符:s
。 這意味着你可以像這樣寫一個url的搜索和替換:
:s?http://foo.com?http://bar.com?g
我接受了安德魯拉德夫的解決方案 ,解決了困難的部分。 但這是我添加到我的vimrc文件的版本,它增加了一些增強功能:
cnoremap <c-x> <c-r>=<SID>PasteEscaped()<cr>
function! s:PasteEscaped()
echo "\\".getcmdline()."\""
let char = getchar()
if char == "\<esc>"
return ''
else
let register_content = getreg(nr2char(char))
let escaped_register = escape(register_content, '\'.getcmdtype())
return substitute(escaped_register, '\n', '\\n', 'g')
endif
endfunction
這應該工作:
/
或?
(向前搜索或向后搜索) 另外,我改變了提示。 在等待寄存器時,提示切換到\\
- 這似乎是'PasteEscaped'的合適提示。 另外,我附加了一個"
, "
在命令行按<cr>
后模仿Vim的行為。
如果您有任何進一步的改進建議,請發表評論。
不同的工作流程如何? 例如,創建自己的運算符以按原樣搜索目標文本:
" https://gist.github.com/1213642
" Requiement: https://github.com/kana/vim-operator-user
map YourFavoriteKeySequence <Plug>(operator-search-target-text)
call operator#user#define('search-target-text', 'OperatorSerachTargetText')
function! OperatorSerachTargetText(motion_wise)
execute 'normal!' '`['.operator#user#visual_command_from_wise_name(a:motion_wise).'`]"xy'
let @/ = '\V' . escape(substitute(@x, '[\r\n]$', '', ''), '\')
normal! n
endfunction
我喜歡@ nelstrom的解決方案並進行了一些小改動以支持逃避[和]。
cnoremap <c-x> <c-r>=<SID>PasteEscaped()<cr>
function! s:PasteEscaped()
echo "\\".getcmdline()."\""
let char = getchar()
if char == "\<esc>"
return ''
else
let register_content = getreg(nr2char(char))
let escaped_register = escape(register_content, '\'.getcmdtype())
let escaped_register2 = substitute(escaped_register,'[','\\[','g')
let escaped_register3 = substitute(escaped_register2,']','\\]','g')
return substitute(escaped_register3, '\n', '\\n', 'g')
endif
endfunction
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.