Vimでペースト時に自動インデントをさせない方法

はじめに

今日はいつもと違った毛色の投稿を…。 Vim上での作業をちょくちょくするのですが、コピペでVim上に貼り付ける際に、自動インデントされて凄い面倒な事に時たまなります。 しょっちゅう対応方法を失念してしまうのでメモ。

事象と対応策

例えば、以下は他のサイト様を参考にカスタマイズしたzshの設定ファイルなのですが

# (d) is default on

# ------------------------------
# General Settings
# ------------------------------
export EDITOR=vim        # エディタをvimに設定
export LANG=ja_JP.UTF-8  # 文字コードをUTF-8に設定
export KCODE=u           # KCODEにUTF-8を設定
export AUTOFEATURE=true  # autotestでfeatureを動かす

bindkey -e               # キーバインドをemacsモードに設定
#bindkey -v              # キーバインドをviモードに設定

setopt no_beep           # ビープ音を鳴らさないようにする
setopt auto_cd           # ディレクトリ名の入力のみで移動する 
setopt auto_pushd        # cd時にディレクトリスタックにpushdする
setopt correct           # コマンドのスペルを訂正する
setopt magic_equal_subst # =以降も補完する(--prefix=/usrなど)
setopt prompt_subst      # プロンプト定義内で変数置換やコマンド置換を扱う
setopt notify            # バックグラウンドジョブの状態変化を即時報告する
setopt equals            # =commandを`which command`と同じ処理にする

### Complement ###
autoload -U compinit; compinit # 補完機能を有効にする
setopt auto_list               # 補完候補を一覧で表示する(d)
setopt auto_menu               # 補完キー連打で補完候補を順に表示する(d)
setopt list_packed             # 補完候補をできるだけ詰めて表示する
setopt list_types              # 補完候補にファイルの種類も表示する
bindkey "^[[Z" reverse-menu-complete  # Shift-Tabで補完候補を逆順する("\e[Z"でも動作する)

### zstyle ###
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # 補完時に大文字小文字を区別しない
zstyle ':completion:*' list-separator '-->'
zstyle ':completion:*:default' menu select=2

### Glob ###
setopt extended_glob # グロブ機能を拡張する
unsetopt caseglob    # ファイルグロブで大文字小文字を区別しない

### History ###
HISTFILE=~/.zsh_history   # ヒストリを保存するファイル
HISTSIZE=10000            # メモリに保存されるヒストリの件数
SAVEHIST=10000            # 保存されるヒストリの件数
setopt bang_hist          # !を使ったヒストリ展開を行う(d)
setopt extended_history   # ヒストリに実行時間も保存する
setopt hist_ignore_dups   # 直前と同じコマンドはヒストリに追加しない
setopt share_history      # 他のシェルのヒストリをリアルタイムで共有する
setopt hist_reduce_blanks # 余分なスペースを削除してヒストリに保存する

# マッチしたコマンドのヒストリを表示できるようにする
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

# すべてのヒストリを表示する
function history-all { history -E 1 }


# ------------------------------
# Look And Feel Settings
# ------------------------------
### Ls Color ###
# 色の設定
export LSCOLORS=Exfxcxdxbxegedabagacad
# 補完時の色の設定
export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
# ZLS_COLORSとは?
export ZLS_COLORS=$LS_COLORS
# lsコマンド時、自動で色がつく(ls -Gのようなもの?)
export CLICOLOR=true
# 補完候補に色を付ける
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

### Prompt ###
# プロンプトに色を付ける
autoload -U colors; colors
# 一般ユーザ時
tmp_prompt="%{${fg[cyan]}%}%n%# %{${reset_color}%}"
tmp_prompt2="%{${fg[cyan]}%}%_> %{${reset_color}%}"
tmp_rprompt="%{${fg[green]}%}[%~]%{${reset_color}%}"
tmp_sprompt="%{${fg[yellow]}%}%r is correct? [Yes, No, Abort, Edit]:%{${reset_color}%}"

# rootユーザ時(太字にし、アンダーバーをつける)
if [ ${UID} -eq 0 ]; then
  tmp_prompt="%B%U${tmp_prompt}%u%b"
  tmp_prompt2="%B%U${tmp_prompt2}%u%b"
  tmp_rprompt="%B%U${tmp_rprompt}%u%b"
  tmp_sprompt="%B%U${tmp_sprompt}%u%b"
fi

PROMPT=$tmp_prompt    # 通常のプロンプト
PROMPT2=$tmp_prompt2  # セカンダリのプロンプト(コマンドが2行以上の時に表示される)
RPROMPT=$tmp_rprompt  # 右側のプロンプト
SPROMPT=$tmp_sprompt  # スペル訂正用プロンプト
# SSHログイン時のプロンプト
[ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
  PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
;

### Title (user@hostname) ###
case "${TERM}" in
kterm*|xterm*|)
  precmd() {
    echo -ne "\033]0;${USER}@${HOST%%.*}\007"
  }
  ;;
esac


# ------------------------------
# Other Settings
# ------------------------------
### RVM ###
if [[ -s ~/.rvm/scripts/rvm ]] ; then source ~/.rvm/scripts/rvm ; fi

### Macports ###
case "${OSTYPE}" in
  darwin*)
    export PATH=/opt/local/bin:/opt/local/sbin:$PATH
    export MANPATH=/opt/local/share/man:/opt/local/man:$MANPATH
  ;;
esac

### Aliases ###
alias r=rails
alias v=vim

# cdコマンド実行後、lsを実行する
function cd() {
  builtin cd $@ && ls;
}

これをvim上で貼り付けようとすると以下の様になっちゃいます。

# (d) is default on
#
# # ------------------------------
# # General Settings
# # ------------------------------
# export EDITOR=vim        # エディタをvimに設定
# export LANG=ja_JP.UTF-8  # 文字コードをUTF-8に設定
# export KCODE=u           # KCODEにUTF-8を設定
# export AUTOFEATURE=true  # autotestでfeatureを動かす
#
# bindkey -e               # キーバインドをemacsモードに設定
# #bindkey -v              # キーバインドをviモードに設定
#
# setopt no_beep           # ビープ音を鳴らさないようにする
# setopt auto_cd           # ディレクトリ名の入力のみで移動する 
# setopt auto_pushd        # cd時にディレクトリスタックにpushdする
# setopt correct           # コマンドのスペルを訂正する
# setopt magic_equal_subst # =以降も補完する(--prefix=/usrなど)
# setopt prompt_subst      # プロンプト定義内で変数置換やコマンド置換を扱う
# setopt notify            # バックグラウンドジョブの状態変化を即時報告する
# setopt equals            # =commandを`which command`と同じ処理にする
#
# ### Complement ###
# autoload -U compinit; compinit # 補完機能を有効にする
# setopt auto_list               # 補完候補を一覧で表示する(d)
# setopt auto_menu               # 補完キー連打で補完候補を順に表示する(d)
# setopt list_packed             # 補完候補をできるだけ詰めて表示する
# setopt list_types              # 補完候補にファイルの種類も表示する
# bindkey "^[[Z" reverse-menu-complete  # Shift-Tabで補完候補を逆順する("\e[Z"でも動作する)
#
# ### zstyle ###
# zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # 補完時に大文字小文字を区別しない
# zstyle ':completion:*' list-separator '-->'
# zstyle ':completion:*:default' menu select=2
#
# ### Glob ###
# setopt extended_glob # グロブ機能を拡張する
# unsetopt caseglob    # ファイルグロブで大文字小文字を区別しない
#
# ### History ###
# HISTFILE=~/.zsh_history   # ヒストリを保存するファイル
# HISTSIZE=10000            # メモリに保存されるヒストリの件数
# SAVEHIST=10000            # 保存されるヒストリの件数
# setopt bang_hist          # !を使ったヒストリ展開を行う(d)
# setopt extended_history   # ヒストリに実行時間も保存する
# setopt hist_ignore_dups   # 直前と同じコマンドはヒストリに追加しない
# setopt share_history      # 他のシェルのヒストリをリアルタイムで共有する
# setopt hist_reduce_blanks # 余分なスペースを削除してヒストリに保存する
#
# # マッチしたコマンドのヒストリを表示できるようにする
# autoload history-search-end
# zle -N history-beginning-search-backward-end history-search-end
# zle -N history-beginning-search-forward-end history-search-end
# bindkey "^P" history-beginning-search-backward-end
# bindkey "^N" history-beginning-search-forward-end
#
# # すべてのヒストリを表示する
# function history-all { history -E 1 }
#
#
# # ------------------------------
# # Look And Feel Settings
# # ------------------------------
# ### Ls Color ###
# # 色の設定
# export LSCOLORS=Exfxcxdxbxegedabagacad
# # 補完時の色の設定
# export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
# # ZLS_COLORSとは?
# export ZLS_COLORS=$LS_COLORS
# # lsコマンド時、自動で色がつく(ls -Gのようなもの?)
# export CLICOLOR=true
# # 補完候補に色を付ける
# zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
#
# ### Prompt ###
# # プロンプトに色を付ける
# autoload -U colors; colors
# # 一般ユーザ時
# tmp_prompt="%{${fg[cyan]}%}%n%# %{${reset_color}%}"
# tmp_prompt2="%{${fg[cyan]}%}%_> %{${reset_color}%}"
# tmp_rprompt="%{${fg[green]}%}[%~]%{${reset_color}%}"
# tmp_sprompt="%{${fg[yellow]}%}%r is correct? [Yes, No, Abort, Edit]:%{${reset_color}%}"
#
# # rootユーザ時(太字にし、アンダーバーをつける)
# if [ ${UID} -eq 0 ]; then
#   tmp_prompt="%B%U${tmp_prompt}%u%b"
#     tmp_prompt2="%B%U${tmp_prompt2}%u%b"
#       tmp_rprompt="%B%U${tmp_rprompt}%u%b"
#         tmp_sprompt="%B%U${tmp_sprompt}%u%b"
#         fi
#
#         PROMPT=$tmp_prompt    # 通常のプロンプト
#         PROMPT2=$tmp_prompt2  # セカンダリのプロンプト(コマンドが2行以上の時に表示される)
#         RPROMPT=$tmp_rprompt  # 右側のプロンプト
#         SPROMPT=$tmp_sprompt  # スペル訂正用プロンプト
#         # SSHログイン時のプロンプト
#         [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
   #           PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
#           ;
#
#           ### Title (user@hostname) ###
#           case "${TERM}" in
#           kterm*|xterm*|)
#             precmd() {
#                 echo -ne "\033]0;${USER}@${HOST%%.*}\007"
#                   }
#                     ;;
#                     esac
#
#
#                     # ------------------------------
#                     # Other Settings
#                     # ------------------------------
#                     ### RVM ###
#                     if [[ -s ~/.rvm/scripts/rvm ]] ; then source ~/.rvm/scripts/rvm ; fi
#
#                     ### Macports ###
#                     case "${OSTYPE}" in
#                       darwin*)
#                           export PATH=/opt/local/bin:/opt/local/sbin:$PATH
#                               export MANPATH=/opt/local/share/man:/opt/local/man:$MANPATH
#                                 ;;
#                                 esac
#
#                                 ### Aliases ###
#                                 alias r=rails
#                                 alias v=vim
#
#                                 # cdコマンド実行後、lsを実行する
#                                 function cd() {
#                                   builtin cd $@ && ls;
#                                   }
#

(要は、.zshrcファイルをいじろうとしたので、「#」とか使ってしまうと、開業した際に自動コメントアウトが入っちゃうんでしょうね。

こんな時は以下のようにすると、きれいに貼り付けることが出来ます

ペーストモードを使う

  1. Vimを開く
  2. Vim上で以下のコマンドでペーストモードにする
:set paste
  1. ペーストしたいものを貼り付ける

alコマンドを使う

以下のやり方でも解決できます。

  1. Vimを開く
  2. Vim上で以下のコマンドを打つ
:al
  1. ペーストしたいものを貼り付ける

環境周りは、

GitHub - yuw-unknown/env

上記に上げてあるので、お使いください