簡體   English   中英

為Vim的命令行創建一個映射,在插入之前轉義寄存器的內容

[英]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鍵調出搜索提示,並使用非常無意義的模式
  • 點擊ctrl-x觸發自定義映射(ctrl-x可用)
  • Vim聽下一次按鍵...(按<Esc>將取消)
  • 按'u'將轉義'u'寄存器的內容,並在命令行中插入

試試這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM