1378

私はVimを学ぶために努力しています。

クリップボードからドキュメントにコードを貼り付けると、新しい行の先頭に余分なスペースができます。

line
  line
    line

自動インデントをオフにできることは知っていますが、他の設定が競合しているなどの理由で機能させることができません(.vimrcではかなり明白に見えますが、それらを削除しても問題にはならないようです)。

コードを貼り付けるときに自動インデントをオフにし、コードを書いているときにvimの自動インデントを使用するにはどうすればよいですか?これが私の.vimrcファイルです:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  
4

25 に答える 25

2419

更新:ここでより良い答え:https ://stackoverflow.com/a/38258720/62202

コードを貼り付けるときに自動インデントをオフにするために、特別な「貼り付け」モードがあります。

タイプ

:set paste

次に、コードを貼り付けます。ツールチップのテキストに。と表示されていることに注意してください-- INSERT (paste) --

コードを貼り付けたら、貼り付けモードをオフにして、入力時の自動インデントが再び正しく機能するようにします。

:set nopaste

しかし、私はいつもそれが面倒だと感じました。そのため、テキストの編集中<F3>に貼り付けモードと貼り付けなしモードを切り替えることができるようにマップします。 これを追加します.vimrc

set pastetoggle=<F3>
于 2010-03-25T10:02:14.307 に答える
281

貼り付け中の望ましくない影響を回避するために、設定する必要のあるオプションがあります。

set paste

.vimrcにある便利なコマンドは、set pastetoggle=<F10>またはその他のボタンで、貼り付けと貼り付けなしを簡単に切り替えることができます。

于 2010-03-25T10:15:21.297 に答える
141

私は通常、コンテンツを使用:r! catして貼り付けます。( shift + insert )CTRL+D

直接使用を有効または無効にする必要はありません。

于 2010-03-30T12:50:15.110 に答える
92

ローカルで作業している場合は、システムクリップボードからキーシーケンスを使用して貼り付けることができます。

"+p

これは適切なvimコマンドであるため、最初に挿入モードに入ったり、自動インデントをオフにしたりすることを心配する必要はありません。

もちろん、リモートで作業している場合(たとえば、SSH経由のコンソール)、これは機能しません。他の場所で説明されているように:set noai、挿入モードに移動し、コンソールに貼り付け、挿入モードを終了し、:set aiルーティングする必要があります。

于 2011-11-05T07:45:24.880 に答える
73

で貼り付けモードを設定すること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にもあります

于 2016-07-08T04:00:35.113 に答える
38

Macユーザーは、次のコマンドを使用してペーストボードから直接読み取ることにより、自動フォーマットを回避できます。

:r !pbpaste
于 2013-08-28T12:58:25.740 に答える
20

これは、貼り付けイベントを再マップして、貼り付けモードを自動的にオンにしてからオフに戻す方法を見つけた人による投稿です。MacOSXのtmux/iTermで動作します。

于 2014-02-08T20:30:22.837 に答える
17

set clipboard=unnamed.vimrcを入れただけです。これにより、デフォルトの貼り付けバッファがXのクリップボードにマップされます。

したがって、ターミナルでテキストを少しマークすると、を押しpてvimに貼り付けることができます。同様に、vimで物事をYYヤンクし(たとえば、現在の行をバッファーにヤンクする)、任意のウィンドウを中クリックして貼り付けることができます。

知らない。とても便利だと思います。

于 2015-01-20T11:15:37.357 に答える
17

これをに追加すると、貼り付けの前後にF2~/.vimrcキーを押すだけで済みます。

set pastetoggle=<F2>
于 2015-03-22T17:27:05.853 に答える
11

ターミナル内で作業する場合、vim-bracketed-paste vimプラグインは、貼り付けの前後にキーストロークを必要とせずに、貼り付けを自動的に処理します。

これは、iTerm2、gnome-terminal、およびlibvteを使用する他の端末などの「最新の」x-term互換端末によって送信されるエスケープシーケンスであるブラケット貼り付けモードを検出することによって機能します。追加のボーナスとして、tmuxセッションでも機能します。Linuxサーバーに接続してtmuxを使用しているMacのiTerm2で正常に使用しています。

于 2016-04-09T03:53:21.310 に答える
9

これを〜/ .vimrcに貼り付けて、幸せになりましょう。

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

編集:リフレクションで:r !catは、短くてセマンティックであり、カスタムvimrcを必要としないため、はるかに優れたアプローチです。代わりにそれを使用してください!

于 2013-06-07T21:25:37.997 に答える
7

私はPythonユーザーで、Vimにコピーして貼り付けることがあります。(私はMacからWindows WSLに切り替えました)そしてこれは私を悩ませたグリッチの1つでした。

をタッチしてscript.pyからvi script.pyを押すと、ViはそれがPythonスクリプトであることを検出し、役立つ、自動インデント、余分なインデントを付けて貼り付けるなどを試みます。これは、Pythonスクリプトであると言わなければ起こりません。

ただし、それがすでに発生している場合は、すでに完全にインデントされたコードを貼り付けると、デフォルトの自動インデントが悪夢になる可能性があります(以下の傾斜したはしごの形状を参照)。

私は3つのオプションを試しましたが、結果は次のとおりです

set paste        # works perfect 
set noai         # still introduced extra whitespace
set noautoindent # still introduced extra whitespace

ここに画像の説明を入力してください ここに画像の説明を入力してください

于 2020-07-19T15:34:14.460 に答える
6

また:pastetoggleはとは正常に機能:pasteして:nopasteいるはずですが(実装されている場合-ディスカッションからわかるように常にそうであるとは限りません)、直接アプローチを使用して貼り付けたり、"+pまたは"*pで読んだりする"+rことを強くお勧めし"*rます:

Vimには10種類のレジスター(:help registers)へのアクセスがあり、質問者はセクションに興味がquotestarあります。quoteplus

  1. 選択およびドロップレジスタ"*"+および "〜

これらのレジスタを使用して、GUI用に選択したテキストを保存および取得します。quotestarおよびを参照してくださいquoteplus。クリップボードが使用できないか機能していない場合は、代わりに名前のないレジスタが使用されます。Unixシステムの場合、クリップボードは+xterm_clipboard機能が存在する場合にのみ使用できます。{Viにはありません}

X11システムの場合、「*」と「+」の違いのみがあることに注意してください。

:help x11-selection*との違いをさらに明確にします+

                                                  quoteplus quote+

文書化されたXセレクションは3つあります:PRIMARY(現在のビジュアルセレクションを表すと予想されます-Vimのビジュアルモードのように)、SECONDARY(明確に定義されていません)、CLIPBOARD(カット、コピー、ペースト操作に使用されると予想されます) )。

これら3つのうち、Vimは "*レジスタの読み取りと書き込みにPRIMARYを使用し(したがって、X11選択が使用可能な場合、Vimは" autoselect "の'clipboard'のデフォルト値を設定します)、"+レジスタの読み取りと書き込みにCLIPBOARDを使用します。VimはSECONDARYセレクションにアクセスしません。

例:(デフォルトのオプション値を想定)

  • VimのビジュアルモードでURLを選択します。ブラウザに移動し、URLテキストフィールドでマウスの中ボタンをクリックします。選択したテキストが挿入されます(うまくいけば!)。注:Firefoxでは、about:configでmiddlemouse.contentLoadURLプリファレンスをtrueに設定できます。そうすると、ウィンドウ内のほとんどの場所でマウスの中ボタンを押すと、選択したURLが使用されます。

  • マウスでドラッグして、ブラウザでテキストを選択します。Vimに移動し、マウスの中ボタンを押します。選択したテキストが挿入されます。

  • Vimでテキストを選択し、「+ y」を実行します。ブラウザに移動し、マウスでドラッグしてテキストフィールドでテキストを選択します。次に、マウスの右ボタンを使用して、ポップアップメニューから[貼り付け]を選択します。選択したテキストは次のように上書きされます。 Vimからのテキスト。ビジュアル選択を行うときに「+レジスタ」のテキストが引き続き使用可能であることに注意してください。これにより、「*レジスタ」で他のテキストが使用可能になります。これにより、選択したテキストを上書きできます。
于 2017-04-18T06:20:48.730 に答える
5

貼り付けるもう1つの方法は<C-r>、挿入モードでレジスタ(ここではグローバルレジスタ)の内容を削除することです。を参照してください::h i_ctrl-rおよびh i_CTRL-R_CTRL-O

vimヘルプドキュメントから:

レジスタの内容を文字通り挿入し、自動インデントしないでください。マウスで貼り付けるのと同じです。文字を置き換えません!'。' register(最後に挿入されたテキスト)は入力されたまま挿入されます。{Viにはありません}

したがって、自動インデントなしでコンテンツをvimに貼り付けるには<C-r><C-o>*、ほとんどのUNIXシステムで使用します。

vimrcにマッピングを追加して、を使用して自動インデントなしでレジスタinoremap <C-r> <C-r><C-o>の内容を通常どおり貼り付けることができます。*<C-r>*

注:これは、vimが。でコンパイルされている場合にのみ機能しclipboardます。

于 2017-04-15T06:09:14.697 に答える
5

私が今まで見なかった別の答え:

:se paste noai
于 2019-05-25T19:10:16.023 に答える
4

これは私にとってはうまくいきます(+レジスタの場合、aps間の交換バッファのように使用します):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
于 2012-06-01T15:53:47.503 に答える
3

vimから:]p

外から:"*]pまたは"+]p

于 2018-07-22T16:55:04.807 に答える
2

Macを使用している場合、macvimは貼り付けを切り替えることなくそれをうまく処理できるようです。

brew install macvim --override-system-vim

于 2014-05-18T14:05:27.010 に答える
1

この記事を読んでください:コード貼り付けの自動インデントを切り替えます

ステータスラインに次の代替案で表示される視覚的なフィードバックを好む人もいますvimrc

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
于 2015-07-01T11:18:44.427 に答える
1

ワンショットペーストの貼り付け挿入モードにすばやく移行するために私が知っている最速の方法は、tpopeの障害のないものです。これは、機能yoyO、おそらく「開く」ためのニーモニックです。それらは彼のvimdocに次のようにのみ文書化されています:

単独挿入のラッピングの一般的な使用例は非常に無駄であるため、「貼り付け」の切り替えは提供されていません。2回切り替えますが、貼り付けは1回だけです(YOPO)。代わりに、yoまたはyOを押して、「貼り付け」がすでに設定されているoまたはOを呼び出します。挿入モードを終了すると、「nopaste」が自動的に設定されます。

于 2015-08-13T21:00:21.553 に答える
1

ネイティブペースト/ブラケットペーストは、vim 8(2016年にリリースされた)以来、最良かつ最も簡単な方法です。sshでも動作します!(括弧で囲まれた貼り付けはLinuxとMacで機能しますが、Windows Git Bashでは機能しません)

  1. vim 8以降があることを確認してください(+clipboardまたは+xterm_clipboardオプションは必要ありません)。

    vim --version | head -1

  2. 通常モードでOSネイティブの貼り付けコマンド(例ctrl+shift+Vまたは)を使用するだけです。挿入モードをcmd+V押さないでください。i


テスト

  1. この出力(タブインデント付きの2行)をシステムクリップボードにコピー(ctrl+shift+Cまたは)します。cmd+C

    echo -e '\ta\n\tb'

  2. 自動インデントを使用してクリーンなvim8+を起動します。

    vim -u NONE --noplugin -c 'set autoindent'

  3. 通常モードでシステムクリップボード(ctrl+shift+Vまたは)から貼り付けます。挿入モードをcmd+V押さないでください。iおよびは、単一のタブインデントに揃える必要がありますabリモートマシンにSSH接続しているときにもこれを行うことができます(リモートマシンにはvim 8以降が必要です)。

  4. i次に、古い方法を試してください。これにより、追加のタブで2行目が自動インデントされます。[挿入モード]を押します。ctrl+shift+V次に、またはを使用して貼り付けcmd+Vます。とがずれていますab


Vim8のインストール

于 2019-06-26T22:38:56.727 に答える
1

この問題はすでに解決されていますが、独自の解決策を追加することもできます。

システム全体で自動インデントを無効にしたい場合は、すべてのファイルタイプで(基本的に、自動インデント機能を完全に無効にします)、次の操作を実行できます。

  1. ファイルをバックアップしindent.vimます。
    sudo mv /usr/share/vim/vim81/indent.vim /usr/share/vim/vim81/indent.vim.orig
  2. 新しい空のindent.vimファイルを作成します。
    sudo touch /usr/share/vim/vim81/indent.vim
于 2020-09-18T02:06:27.923 に答える
0

悲しいことに、私はvimプラグインがiTerm2 3.0.15で動作していないことに気づきました(公平を期すために、これが古いバージョンで壊れたかどうかはわかりません)-しかし、代わりにこのハックを見つけました。

command-pをマップして、貼り付けを行い、iTerm2vimキーを使用します。明らかに、これはiTerm2でのみ機能します。

使い方。「jk」を使用してエスケープモードに入るので、次のものも必要になります。

:inoremap jk

.vimrcで。

次に、Pを呼び出して貼り付けモードに入り、 "+ pを呼び出してクリップボードから貼り付け、次にPを呼び出して貼り付けモードを無効にします。hth。

ここに画像の説明を入力してください

于 2017-09-16T01:05:46.027 に答える
0

次のvimプラグインは、「ブラケット貼り付け」モードを介して自動的に処理します:https ://github.com/wincent/terminal

「ブラケット貼り付け」モードを設定します。これは、「貼り付け」オプションを手動で設定することを忘れて、任意のモードで貼り付けることができることを意味します。

于 2020-09-05T17:53:09.067 に答える
0

上記のvimを使用している場合は、v8.2で確認できます:help tmux-integration

tmux内でVimを実行しているときに問題が発生した場合は、ここにいくつかのヒントがあります。何かが機能しない場合は、パーツをコメントアウトできます(tmuxが実行されている端末によって異なる場合があります)。

if !has('gui_running') && &term =~ '^\%(screen\|tmux\)'
    " Better mouse support, see  :help 'ttymouse'
    set ttymouse=sgr

    " Enable true colors, see  :help xterm-true-color
    let &termguicolors = v:true
    let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
    let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"

    " Enable bracketed paste mode, see  :help xterm-bracketed-paste
    let &t_BE = "\<Esc>[?2004h"
    let &t_BD = "\<Esc>[?2004l"
    let &t_PS = "\<Esc>[200~"
    let &t_PE = "\<Esc>[201~"

    " Enable focus event tracking, see  :help xterm-focus-event
    let &t_fe = "\<Esc>[?1004h"
    let &t_fd = "\<Esc>[?1004l"

    " Enable modified arrow keys, see  :help xterm-modifier-keys
    execute "silent! set <xUp>=\<Esc>[@;*A"
    execute "silent! set <xDown>=\<Esc>[@;*B"
    execute "silent! set <xRight>=\<Esc>[@;*C"
    execute "silent! set <xLeft>=\<Esc>[@;*D"
endif
于 2021-11-17T01:44:32.450 に答える