私はVimを学ぶように努力しています。
クリップボードから自分のドキュメントにコードを貼り付けると、新しい各行の先頭に余分なスペースが表示されます。
line
line
line
私はあなたが自動インデントをオフにすることができます知っているが、私はいくつかの他の設定が競合したり(私の.vimrcにかなり明白に見えるが、私はそれらを取る際には関係していないようです)何か持っているので、私はそれを動作させることはできません。
コードを貼り付けたときに自動インデントをオフにしても、コードを書いているときに自動インデントを有効にするにはどうすればよいですか。これが私の.vimrc
ファイルです。
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
更新: より良い答えはこちら: https://stackoverflow.com/a/38258720/62202
コードを貼り付けたときに自動インデントをオフにするために、特別な「貼り付け」モードがあります。
タイプ
:set paste
次にコードを貼り付けます。ツールチップのテキストに-- INSERT (paste) --
と表示されていることに注意してください。
コードを貼り付けたら、貼り付けモードをオフにして、入力時の自動インデントが再度正しく機能するようにします。
:set nopaste
しかし、私はいつもそれが面倒だと思った。 <F3>
を貼り付けモードとnopasteモードの間で切り替えられるようにマッピングするのはそのためです テキストを編集しながら! これを.vimrc
に追加します。
set pastetoggle=<F3>
貼り付け中の望ましくない影響を避けるために、設定が必要なオプションがあります。
set paste
あなたの.vimrcに持っているのに便利なコマンドは、set pastetoggle=<F10>
または他のボタンで、ペーストとnopasteを簡単に切り替えることができます。
私はたいてい:r! cat
を使ってから( shift + insert )
とCTRL+D
を貼り付けています。
有効化および無効化する必要はありません。直接使用します。
ローカルで作業している場合は、キーシーケンスを使ってシステムクリップボードから貼り付けることができます。
"+p
これは正しいvimコマンドなので、最初に挿入モードに入ったり自動インデントをオフにしたりすることを心配する必要はありません。
もちろん、リモートで作業している場合(SSH経由のコンソールなど)、これは機能しません。他の場所で説明しているように、:set noai
、挿入モード、コンソールに貼り付け、insertmodeのまま、:set ai
の順に進む必要があります。
Macユーザーは、ペーストボードから直接読み取ることで自動フォーマットを回避できます。
:r !pbpaste
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サブシステムfor Linux)では機能しません。誰かがWSLのための解決策を持っているなら、この答えを更新するか、またはコメントにそれを追加してください。
Tmux tmuxを使用する場合は、宣言を二重にエスケープする必要があります。このためのコードも Coderwall にあります
これは投稿です 貼り付けイベントを再マップして貼り付けモードを自動的にオンにしてからオフにする方法を考え出した人によるものです。 MacOSX上のtmux/iTermで私のために働きます。
これをあなたの~/.vimrc
に追加すれば、貼り付ける前後に F2 を押すだけで済みます。
set pastetoggle=<F2>
端末の内部で作業する場合、 vim-bracketed-paste vimプラグインは、ペーストの前後にキーストロークを必要とせずに自動的にペーストを処理します。
これは、 括弧付きの貼り付けモード を検出することによって機能します。これは、iTerm2、gnome-terminal、およびlibvteを使用する他の端末などの「最新の」x-term互換端末によって送信されるエスケープシーケンスです。追加のボーナスとして、それはtmuxセッションにも機能します。私はLinuxサーバーに接続してtmuxを使っているMac上のiTerm2でそれをうまく使っています。
私はちょうど私の.vimrcにset clipboard=unnamed
を入れます。これにより、デフォルトの貼り付けバッファはXのクリップボードにマップされます。
ですから、端末にテキストを少し印を付けたら、p
を押すだけでそれをvimに貼り付けることができます。同様に、私はものをvimでヤンクし(例えば現在の行をバッファにヤンクするためにYY
)そしてそれをペーストするために任意のウィンドウ内で中クリックすることができる。
ダンノ。私はそれが超便利だと思います。
これをあなたの〜/ .vimrcに貼り付けて幸せにしてください。
" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'
編集:熟考すると、:r !cat
は短くて意味的で、カスタムのvimrcを必要としないので、はるかに良いアプローチです。代わりにそれを使ってください。
:pastetoggle
または:paste
および:nopaste
はうまく機能するはずですが(実装されている場合 - 議論からわかるように常にではありません)、直接アプローチ"+p
または"*p
を使用して"+r
または"*r
を使用することを強くお勧めします。
Vimは10種類のレジスタ(:help registers
)にアクセスでき、質問者はsectionのquotestar
とquoteplus
に興味があります。
- 選択およびドロップレジスタ
"*
、"+
および "〜これらのレジスタを使用して、GUI用に選択されたテキストを保存および取得します。
quotestar
とquoteplus
を参照してください。クリップボードが利用できない場合や機能していない場合は、代わりに名前なしレジスタが使用されます。 Unixシステムの場合、クリップボードは+ xterm_clipboard機能が存在する場合にのみ利用可能です。 {Viにはない}X11システムでは、 "*"と "+"の違いだけがあることに注意してください。
:help x11-selection
は、*
と+
の違いをさらに明確にします。
quoteplus quote+
3つの文書化されたXの選択があります: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。マウスをドラッグしてテキストフィールド内のテキストを選択します。右マウスボタンを使用してポップアップメニューから"貼り付け "を選択します。 "+"レジスタのテキストはビジュアル選択をしても利用可能なままで、他のテキストは "*"レジスタで利用可能になります。これは選択されたテキストを上書きすることを可能にします。
これは私のために動作します(+レジスタの場合、私はAPS間の交換バッファのように使用するもの):
imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
あなたがMacを使っているのであれば、macvimはペーストをトグルしなくてもうまく扱えるようです。
brew install macvim --override-system-vim
ネイティブペースト/ブラケットペーストは、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+が必要です)。
次に、古い方法を試してください。2番目の行に余分なタブが自動的にインデントされます。挿入モードの場合は、i
を押します。次に、ctrl+shift+V
またはcmd+V
を使用して貼り付けます。 a
とb
の位置がずれています。
Vim 8のインストール
Ubuntu 18.04- デフォルトでVim 8に付属 。
Ubuntu 16.04- PPAからインストール 。
Sudo add-apt-repository ppa:jonathonf/vim
Sudo apt update
Sudo apt install vim
brew install vim
Vimから:]p
外部から:"*]p
または"+]p
ワンショットペーストのためにペースト - 挿入モードにすばやく行くために私が知っている最も速い方法はtpopeの unimpaired であり、これはyo
とyO
を特徴とします。 「あなたが開く」のために。それらは彼のvimdocで以下のように文書化されているだけです:
単独挿入の折り返しの典型的な使用例は非常に無駄が多いので、 '貼り付け'にトグルは用意されていません。2回トグルしますが、1回だけ貼り付ける(YOPO)代わりに、 'または'を押して 'または'を呼び出して、 '貼り付け'をすでに設定してください。挿入モードを終了すると、自動的に「nopaste」が設定されます。
この記事を読んでください: コード貼り付けのための自動インデントの切り替え
あなたの
vimrc
の代わりに次のようにステータスラインに表示される視覚的なフィードバックが好きな人もいます。
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
別の貼り付け方法は、<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>*
を使用してください。
注意:これはvimがclipboard
でコンパイルされている場合にのみ機能します。
私が今まで見なかったもう一つの答え:
:se paste noai