我正在努力学习Vim .
当我从剪贴板将代码粘贴到我的文档中时,我会在每个新行的开头添加额外的空格:
line
line
line
我知道你可以关闭自动缩进但我无法让它工作,因为我有一些其他设置冲突或某事(在我的.vimrc中看起来非常明显,但是当我把它们取出时似乎并不重要) .
当我粘贴代码时如何关闭自动缩进但在编写代码时仍然有自动缩进?这是我的 .vimrc
文件:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
19 回答
如果你在Mac上,macvim似乎无需切换粘贴就可以很好地处理它 .
brew install macvim --override-system-vim
Update: 这里更好的答案:https://stackoverflow.com/a/38258720/62202
要在粘贴代码时关闭自动注册,需要使用特殊的“粘贴”模式 .
类型
然后粘贴您的代码 . 请注意,工具提示中的文本现在显示为
-- INSERT (paste) --
.粘贴代码后,请关闭粘贴模式,以便在键入时自动缩进再次正常工作 .
但是,我总觉得那很累赘 . 这就是为什么我映射
<F3>
这样它可以在编辑文本时在粘贴和nopaste模式之间切换!我把它添加到.vimrc
为了避免在粘贴时产生不良影响,需要设置一个选项:
在.vimrc中有一个有用的命令是
set pastetoggle=<F10>
或其他一些按钮,可以轻松地在粘贴和nopaste之间切换 .我通常使用
:r! cat
然后粘贴( shift + insert )
内容和CTRL+D
.无需启用和禁用,直接使用 .
如果您在本地工作,则可以使用键序列从系统剪贴板粘贴:
"+p
这是一个正确的vim命令,因此无需担心首先进入插入模式或关闭自动注册 .
当然,如果您正在远程工作(例如通过SSH控制台),那么这将无法工作,您应该按照其他地方的描述进入
:set noai
,插入模式,粘贴到控制台,保留insertmode,:set ai
路由 .Mac用户可以通过以下方式直接从粘贴板中读取来避免自动格式化:
虽然使用
paste/nopaste/pastetoggle
设置粘贴模式非常精细,但您仍需要在粘贴之前手动启用粘贴模式,并在粘贴后禁用粘贴模式 . 作为我的懒人,下面是我到目前为止找到的最佳解决方案,它会在您粘贴时自动切换粘贴模式 .inoremap <special> <expr> <Esc> [200~XTermPasteBegin()
功能! XTermPasteBegin()
设置pastetoggle = <Esc> [201~
设置粘贴
返回“”
endfunction这样
现在您可以粘贴而无需明确打开/关闭粘贴模式 - 它会自动为您处理 .
资料来源:Coderwall
Note: 此解决方案在WSL(适用于Linux的Windows 10子系统)中不起作用 . 如果有人有WSL解决方案,请更新此答案或将其添加到评论中 .
Here is a post是一个想出如何重新映射粘贴事件以自动打开粘贴模式然后退回的人 . 适用于MacOSX上的tmux / iTerm .
将此添加到
~/.vimrc
,您只需在粘贴前后按 F2 :我只是把
set clipboard=unnamed
放在我的.vimrc中 . 这使得默认的粘贴缓冲区映射到X的剪贴板 .所以,如果我在终端上标记了一些文字,我可以按
p
将其粘贴到vim中 . 类似地,我可以在vim中抓取东西(例如YY
将当前行拉入缓冲区)并在任何窗口中间点击以粘贴它 .不知道 . 我发现它非常方便 .
在终端内部工作时,vim-bracketed-paste vim插件将自动处理粘贴,而无需在粘贴之前或之后进行任何击键 .
它通过检测bracketed paste mode来工作,这是一个由使用libvte的"modern" x-term兼容终端(如iTerm2,gnome-terminal和其他终端)发送的转义序列 . 作为额外奖励,它也适用于tmux会话 . 我在连接Linux服务器和使用tmux的Mac上成功使用iTerm2 .
把它粘在你的〜/ .vimrc中并开心:
编辑:在反思中,
:r !cat
是一个更好的方法,因为它很短,语义,并且不需要自定义vimrc . 改用它!这适用于我(注册的情况,我使用的像aps之间的交换缓冲区):
虽然
:pastetoggle
或者:paste
和:nopaste
应该正常工作(如果实施 - 它们并不总是我们从讨论中看到的那样)我强烈建议使用直接方法"+p
或"*p
并使用"+r
或"*r
阅读:Vim有十种类型的寄存器(
:help registers
),提问者对quotestar
和quoteplus
感兴趣:help x11-selection
进一步澄清*
和+
的区别:请阅读这篇文章:Toggle auto-indenting for code paste
我知道快速进入粘贴插入模式进行一次性粘贴的最快方法是tpope的unimpaired,它具有 yo 和 yO ,可能是“你打开”的助记符 . 他们只记录在他的vimdoc中,如:
另一种粘贴方式是通过
<CR>
并删除寄存器的内容(这里是全局寄存器) . 见::h i_ctrl-r
和h i_CTRL-R_CTRL-O
.从vim帮助文档:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}
因此,要在没有自动缩进的情况下将内容粘贴到vim中,请在大多数unix系统中使用
<CR><CO>*
.注意:这仅适用于使用
clipboard
编译vim的情况 .可悲的是,我发现提到的vim插件不能与iTerm2 3.0.15一起使用(公平地说我不知道这是否在旧版本中出现了) - 但我发现这个黑客而已 .
映射命令-p以执行粘贴并使用iTerm2 vim键 . 显然这仅适用于iTerm2 .
这个怎么运作 . 我使用“jk”进入转义模式,因此您还需要:
:inoremap jk
在你的.vimrc中 .
然后它只是调用P进入粘贴模式,“p从剪贴板粘贴,然后P到禁用粘贴模式.hth .
来自vim:
]p
从外面:
"*]p
或"+]p