将文本粘贴到vim时关闭自动缩进
我正在努力学习Vim 当我从剪贴板将代码粘贴到文档中时,在每一行的开头都会有额外的空格:将文本粘贴到vim时关闭自动缩进,vim,configuration,editor,indentation,auto-indent,Vim,Configuration,Editor,Indentation,Auto Indent,我正在努力学习Vim 当我从剪贴板将代码粘贴到文档中时,在每一行的开头都会有额外的空格: line line line 我知道你可以关闭自动缩进,但我无法让它工作,因为我有一些其他设置冲突或其他东西(在我的.vimrc中看起来很明显,但当我取出它们时似乎并不重要) 如何在粘贴代码时关闭自动缩进,但在编写代码时仍然使用vim自动缩进?这是我的.vimrc文件: set expandtab set tabstop=2 set shiftwidth=2 set autoind
line
line
line
我知道你可以关闭自动缩进,但我无法让它工作,因为我有一些其他设置冲突或其他东西(在我的.vimrc中看起来很明显,但当我取出它们时似乎并不重要)
如何在粘贴代码时关闭自动缩进,但在编写代码时仍然使用vim自动缩进?这是我的.vimrc
文件:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
更新:最好在这里回答: 要在粘贴代码时关闭自动缩进,有一种特殊的“粘贴”模式 类型 然后粘贴代码。请注意,工具提示中的文本现在显示为
--INSERT(paste)--
粘贴代码后,请关闭粘贴模式,以便键入时自动缩进再次正常工作
:set nopaste
然而,我总是觉得很麻烦。这就是为什么我映射
,这样它可以在编辑文本时在粘贴和非粘贴模式之间切换!我将其添加到.vimrc
set pastetoggle=<F3>
设置粘贴切换=
为了避免粘贴时出现不希望出现的效果,需要设置一个选项:
set paste
在.vimrc中有一个有用的命令是
设置粘贴切换=
或其他一些按钮,可以轻松地在粘贴和非粘贴之间切换。我通常使用:r!cat
,然后粘贴(shift+insert)
内容,然后CTRL+D
无需启用和禁用,直接使用。如果您在本地工作,您可以使用以下键顺序从系统剪贴板粘贴:
“+p
这是一个正确的vim命令,因此无需担心进入插入模式或首先关闭自动缩进
当然,如果您正在远程工作(例如,通过SSH进行控制台),那么这将不起作用,您应该进入:设置noai
,插入模式,粘贴到控制台,离开insertmode,:设置ai
路由,如其他地方所述。这对我有效(对于+注册,我使用的是AP之间的交换缓冲):
imap:set noai+:set ai
将此粘贴在~/.vimrc中,并快乐:
" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'
编辑:在反思中,
:r!cat
是一种更好的方法,因为它很短,具有语义,并且不需要自定义vimrc。使用它吧!Mac用户可以通过直接从粘贴板读取以下内容来避免自动格式化:
:r !pbpaste
由了解如何重新映射粘贴事件以自动打开然后关闭粘贴模式的人编写。在MacOSX上的tmux/iTerm中对我有效。如果您在mac上,macvim似乎可以很好地处理它,而无需切换粘贴
brew install macvim--覆盖系统vim我刚刚将
设置剪贴板=未命名放在my.vimrc中。这使默认的粘贴缓冲区映射到X的剪贴板
因此,如果我在终端中标记了一点文本,我可以简单地按p
将其粘贴到vim中。同样,我可以在vim中拖动内容(例如YY
将当前行拖动到缓冲区中),然后在任何窗口中单击鼠标中键将其粘贴
我不知道。我觉得非常方便。将此添加到您的~/.vimrc
中,您只需在粘贴之前和之后按F2:
set pastetoggle=<F2>
设置粘贴切换=
请阅读本文:
有些人喜欢通过以下选项在状态行中为您的vimrc
显示的视觉反馈:
nnoremap:是否设置粘贴粘贴?
设置粘贴切换=
设置显示模式
我所知道的快速进入粘贴插入模式进行一次性粘贴的最快方法是tpope's,它的特点是yo
和yo
,可能是“您打开”的助记符。它们只记录在他的vimdoc中,如下所示:
尚未为“粘贴”提供切换,因为
单独插入的包装非常浪费:切换两次,但是
你只能粘贴一次(YOPO)。相反,按yo或yo来调用o或o
“粘贴”已设置。离开插入模式将自动设置为“nopaste”
在终端内部工作时,vim插件将自动处理粘贴,而无需在粘贴之前或之后敲击任何键
它的工作原理是检测由“现代”发送的转义序列“x术语兼容终端,如iTerm2、gnome终端和使用libvte的其他终端。作为额外的奖励,它也适用于tmux会话。我在Mac上成功地使用了iTerm2,它连接到linux服务器并使用tmux。虽然使用paste/nopaste/pastetoggle
设置粘贴模式非常好,但粘贴前仍必须手动启用粘贴模式,粘贴后禁用粘贴模式。作为一个懒惰的人,下面是到目前为止我找到的最好的解决方案,它可以在粘贴时自动切换粘贴模式
这里有一个小技巧,使用终端的括号粘贴模式
粘贴时自动设置/取消设置Vim的粘贴模式。放在下面
在.vimrc中:
let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction
let&t\u SI.=“2004h”
let&t_EI.=“\[?2004l”
inoremap[200~XTermPasteBegin()
函数!XTermPasteBegin()
设置pastetoggle=[201~
凝固浆
返回“”
端功能
现在您可以粘贴,而无需显式地打开/关闭粘贴模式-这是
自动为您处理
资料来源:
注意:此解决方案在WSL(适用于Linux的Windows 10子系统)中不起作用。如果任何人有WSL解决方案,请更新此答案或将其添加到注释中
Tmux如果使用Tmux,则需要对声明进行双转义。此代码也在中。另一种粘贴方式是在插入模式下通过
并删除寄存器(此处为全局寄存器)的内容。请参阅::HI\U ctrl-r
和HI\U ctrl-r\U ctrl-O
从维姆直升机
set pastetoggle=<F2>
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction
quoteplus quote+
:se paste noai
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt install vim
set paste # works perfect
set noai # still introduced extra whitespace
set noautoindent # still introduced extra whitespace