在vim中粘贴时转义字符

问题描述 投票:7回答:4

我将内容从输出缓冲区复制到我正在vim中处理的C ++代码中。通常,此输出卡在字符串中。而且能够自动转义所有控制字符,而不是返回并手动编辑粘贴的片段,将是很好的选择。

作为示例,我可能会复制以下内容:

error in file "foo.dat"

并且需要将它放入这样的东西中

std::string expected_error = "error in file \"foo.dat\""

我认为可以使用最后粘贴的开始和结束标记将替换功能应用于最后粘贴的主体,但是我不确定如何使它飞起来。

更新:

Joey Mazzarelli被处决]

`[v`]h:%s/\%V"/\\"/g

粘贴后。

由于没有给出解释,所以起初我觉得它很简洁,但是在评论中很难解释,我以为我在这里做了解释。

`[  : Move to start of last paste
v   : Start visual mode
`]  : Move to end of last paste
h   : adjust cursor one position left
:%  : apply on the lines of the selection
s/  : replace
\%V : within the visual area
"   : "
/   : with
\\" : \"
/g  : all occurrences

这似乎是一个好方法,但是只能处理一个字符,“,我希望它处理换行符,制表符以及其他可能会出现在文本中的东西。(不过可能不是通用的unicode)我理解问题定义中可能还不清楚。

我将内容从输出缓冲区复制到我正在vim中处理的C ++代码中。通常,此输出卡在字符串中。而且能够自动转义所有控制字符而不是...

vim
4个回答
5
投票

这里有一些应该执行您想要的vimscript函数。


1
投票

这至少可以让您入门...

粘贴后:


0
投票

虽然Joeys解决方案看起来可以扩展以涵盖我需要的所有情况,但我想我会使用vims python集成共享我的部分解决方案(因为我比vim脚本更熟悉python)] >>

# FILE : tocstring.py
import vim
def setRegister(reg, value):
  vim.command( "let @%s='%s'" % (reg, value.replace("'","''") ) )

def getRegister(reg):
  return vim.eval("@%s" % reg )

def transformChar( map, c):
  if c in map:
    return map[c]
  return c

def transformText( map, text ):
  return ''.join( [ transformChar(map,c) for c in text ] )

cmap={}
cmap["\\"]="\\\\"
cmap["\n"]="\\n" 
cmap["\t"]=r"\\t"
cmap['"']="\\\""

def convertToCString( inregister, outregister ):
  setRegister(outregister, transformText( cmap, getRegister(inregister) ) )

然后将其放入我的.vimrc或其他conf文件中


0
投票

对于Java / JavaScript类型的转义,可以使用json_encode

nmap <leader>jp :call setreg('e', json_encode(@+))\| normal "ep<CR>

[json_encode(@+)-json编码寄存器+的内容(映射到剪贴板)

© www.soinside.com 2019 - 2024. All rights reserved.