我正在努力学习Vim。
当我从剪贴板将代码粘贴到我的文档中时,我会在每个新行的开头添加额外的空格:
line
line
line
我知道你可以关闭自动缩进但我无法让它工作,因为我有一些其他设置冲突或某些东西(在我的.vimrc中看起来非常明显但是当我把它们取出时似乎并不重要)。
当我粘贴代码时如何关闭自动缩进但在编写代码时仍然有自动缩进?这是我的.vimrc
文件:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
答案 0 :(得分:1861)
更新:更好地回答:https://stackoverflow.com/a/38258720/62202
要在粘贴代码时关闭自动注册,会有一种特殊的“粘贴”模式。
输入
:set paste
然后粘贴您的代码。请注意,工具提示中的文字现在显示为-- INSERT (paste) --
。
粘贴代码后,请关闭粘贴模式,以便在键入时自动缩进再次正常工作。
:set nopaste
但是,我总觉得那很累赘。这就是为什么我映射<F3>
以便在编辑文本时可以在粘贴和nopaste模式之间切换!我将其添加到.vimrc
set pastetoggle=<F3>
答案 1 :(得分:253)
为了在粘贴时避免不良影响,需要设置一个选项:
set paste
在.vimrc中有一个有用的命令是set pastetoggle=<F10>
或其他按钮,可以轻松地在粘贴和nopaste之间切换。
答案 2 :(得分:123)
我通常使用:r! cat
然后粘贴( shift + insert )
内容和CTRL+D
。
无需启用&amp;禁用,直接使用。
答案 3 :(得分:83)
如果您在本地工作,可以使用键序列从系统剪贴板粘贴:
"+p
这是一个正确的vim命令,因此无需担心首先进入插入模式或关闭自动注册。
当然,如果您正在远程工作(例如通过SSH控制台),那么这将无效,您应该转到:set noai
,插入模式,粘贴到控制台,保留插入模式,:set ai
路线如其他地方所述。
答案 4 :(得分:37)
Mac用户可以通过以下方式直接从粘贴板上阅读来避免自动格式化:
:r !pbpaste
答案 5 :(得分:31)
使用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
现在你可以粘贴而无需明确打开/关闭粘贴模式 - 它就是 为您自动处理。
来源:Coderwall
注意:此解决方案在WSL(Windows 10 Subsystem for Linux)中不起作用。如果有人有WSL解决方案,请更新此答案或将其添加到评论中。
Tmux 如果使用tmux,则声明需要进行双重转义。此代码也在Coderwall
中答案 6 :(得分:19)
Here is a post由某人了解如何重新映射粘贴事件以自动打开粘贴模式然后退回。适用于MacOSX上的tmux / iTerm。
答案 7 :(得分:12)
将此添加到您的~/.vimrc
,您只需在粘贴之前和之后按 F2 :
set pastetoggle=<F2>
答案 8 :(得分:9)
在终端内部工作时,vim-bracketed-paste vim插件会自动处理粘贴,而无需在粘贴之前或之后进行任何击键。
它的工作原理是检测bracketed paste mode,它是&#34;现代&#34; x-term兼容终端,如iTerm2,gnome-terminal和其他使用libvte的终端。作为额外奖励,它也适用于tmux会话。我在连接Linux服务器并使用tmux的Mac上成功使用iTerm2。
答案 9 :(得分:9)
我只是将set clipboard=unnamed
放在我的.vimrc中。这使得默认的粘贴缓冲区映射到X的剪贴板。
所以,如果我在终端中标记了一些文字,我只需按p
即可将其粘贴到vim中。同样,我可以在vim中抓取内容(例如YY
将当前行拉入缓冲区)并在任何窗口中单击以粘贴它。
说不上。我发现它非常方便。
答案 10 :(得分:7)
坚持你的〜/ .vimrc并开心:
" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'
编辑:在反思中,:r !cat
是一个更好的方法,因为它很短,语义,并且不需要自定义vimrc。请改用它!
答案 11 :(得分:3)
虽然:pastetoggle
或:paste
和:nopaste
应该正常工作(如果已实施 - 它们并非总是我们从讨论中看到的那样),我强烈建议使用直接方法粘贴{ {1}}或"+p
并使用"*p
或"+r
阅读:
Vim有十种类型的寄存器("*r
),提问者对:help registers
和quotestar
部分感兴趣
- 选择和删除寄存器
醇>quoteplus
,"*
和&#34;〜使用这些寄存器存储和检索GUI的选定文本。 请参阅
"+
和quotestar
。当剪贴板不可用时 工作时,使用未命名的寄存器。对于Unix系统的剪贴板 仅在存在+ xterm_clipboard功能时可用。 {不在Vi}请注意,对于X11系统,&#34; *和&#34; +之间只有区别。
quoteplus
进一步澄清了:help x11-selection
和*
的区别:
+
有三个记录在案的X选择:PRIMARY(预计会有 表示当前的视觉选择 - 如在Vim的可视模式中),SECONDARY (这是不明确的)和CLIPBOARD(预计将用于 剪切,复制和粘贴操作)。
在这三个中,Vim在读取&#34; *寄存器时使用PRIMARY (因此,当X11选项可用时,Vim会为其设置默认值 &#39;剪贴板&#39; &#34; autoselect&#34;)和CLIPBOARD在读写&#34; +时 寄存器。 Vim不访问SECONDARY选择。
示例:(假设默认选项值)
在Vim中以可视模式选择一个URL。转到您的浏览器并单击 URL文本字段中的鼠标中键。选定的文本将是 插入(希望!)。注意:在Firefox中你可以设置 middle:config中的middlemouse.contentLoadURL首选项为true,然后是 在窗口中的大多数位置按鼠标中键时将使用所选的URL。
通过拖动鼠标在浏览器中选择一些文本。去Vim和 按鼠标中键:插入所选文本。
- 在Vim中选择一些文字并执行&#34; + y。转到您的浏览器,选择一些文本 通过鼠标拖动文本字段。现在使用鼠标右键和 选择&#34;粘贴&#34;从弹出菜单中。所选文本被覆盖 来自Vim的文字。 请注意,制作Visual时,&#34; +寄存器中的文本仍然可用 选择,使其他文本在&#34; *注册中可用。这允许 覆盖选定的文字。
答案 12 :(得分:3)
这对我有用(+寄存器的情况,我用的是aps之间的交换缓冲区):
imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
答案 13 :(得分:2)
自vim 8
(2016年发布)以来,本地粘贴/方括号粘贴是最好和最简单的方法。它甚至可以在ssh上运行! (括号内的粘贴在Linux和Mac上有效,但在Windows Git Bash上无效)
确保您的vim为8+(不需要+clipboard
或+xterm_clipboard
选项)。
vim --version | head -1
在正常模式下仅使用OS本机粘贴命令(例如ctrl+shift+V
或cmd+V
)。请勿按i
进入插入模式。
测试
将此输出(带有标签缩进的2行)复制(ctrl+shift+C
或cmd+C
)到系统剪贴板:
echo -e '\ta\n\tb'
使用autoindent启动干净的vim 8 +:
vim -u NONE --noplugin -c 'set autoindent'
在普通模式下从系统剪贴板(ctrl+shift+V
或cmd+V
)粘贴。请勿按i
进入插入模式。 a
和b
应该与单个制表符缩进对齐。您甚至可以在ssh-ing到远程计算机时执行此操作(远程计算机将需要vim 8 +)。
现在尝试旧方法,该方法将使用额外的选项卡自动缩进第二行:按i
进入插入模式。然后使用ctrl+shift+V
或cmd+V
粘贴。 a
和b
现在未对齐。
安装Vim 8
Ubuntu 18.04-comes with Vim 8 by default。
Ubuntu 16.04-install from a PPA。
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt install vim
brew install vim
答案 14 :(得分:2)
如果您使用的是mac,macvim似乎可以很好地处理它,而无需切换粘贴。
brew install macvim --override-system-vim
答案 15 :(得分:1)
从vim:]p
从外部:"*]p
或"+]p
答案 16 :(得分:1)
这个问题已经得到解决,但是我也可以添加自己的解决方案:
如果只想禁用系统自动缩进,则对于每种文件类型(基本上完全禁用自动缩进功能),可以执行以下操作:
indent.vim
文件:sudo mv /usr/share/vim/vim81/indent.vim /usr/share/vim/vim81/indent.vim.orig
indent.vim
文件:sudo touch /usr/share/vim/vim81/indent.vim
答案 17 :(得分:1)
我知道快速进入一次性粘贴的粘贴插入模式的最快方式是tpope的unimpaired,其功能为 yo
和 yO
,大概是“你打开”的助记符。他们只记录在他的vimdoc中,如:
未提供“粘贴”功能的切换功能。因为典型的用例 单独插入的包装是如此浪费:你切换两次,但是 你只粘贴一次(YOPO)。相反,按y或yO调用o或O with &#39;粘贴&#39;已经设定。离开插入模式设置&#39; nopaste&#39;自动。
答案 18 :(得分:1)
请阅读这篇文章:Toggle auto-indenting for code paste
有些人喜欢您的
vimrc
以下替代方案在状态行中显示的视觉反馈:
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
答案 19 :(得分:0)
可悲的是,我发现提到的vim插件不适用于iTerm2 3.0.15(公平地说我不知道旧版本是否破坏了) - 但我找到了这个黑客。
映射命令-p以执行粘贴并使用iTerm2 vim键。显然这只适用于iTerm2。
工作原理。我用&#34; jk&#34;进入逃生模式所以你还需要:
:inoremap jk
你的.vimrc中的。
然后它只调用P进入粘贴模式,&#34; + p从剪贴板粘贴,然后P调用以禁用粘贴模式。第h
答案 20 :(得分:0)
粘贴的另一种方法是通过.css.js
并删除寄存器的内容(这里是全局寄存器)。请参阅:<CR>
和:h i_ctrl-r
。
从vim帮助文档:
h i_CTRL-R_CTRL-O
因此,要在没有自动缩进的情况下将内容粘贴到vim中,请在大多数unix系统中使用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}
。
注意:这仅适用于使用<CR><CO>*
编译vim的情况。
答案 21 :(得分:0)
直到现在我还没有看到的另一个答案:
:se paste noai
答案 22 :(得分:0)
我是Python用户,有时会复制并粘贴到Vim中。 (我从Mac切换到Windows WSL),这是困扰我的故障之一。
如果依次触摸script.py
和vi script.py
,Vi会检测到它是Python脚本并试图提供帮助,自动缩进,粘贴额外的缩进等,如果您这样做,则不会发生不要说这是Python脚本。
但是,如果您已经发生了这种情况,则在粘贴已经完全缩进的代码时,默认的自动缩进可能是一场噩梦(请参见下面的倾斜梯形)。
我尝试了三个选项,这是结果
set paste # works perfect
set noai # still introduced extra whitespace
set noautoindent # still introduced extra whitespace
答案 23 :(得分:0)
以下vim插件通过其“括号粘贴”模式自动处理该问题:https://github.com/wincent/terminus
设置“括号内粘贴”模式,这意味着您可以省去手动设置“粘贴”选项的麻烦,而只需继续以任何模式粘贴即可。