Vimは䟿利な機胜をたくさん提䟛しおいる。これたで䟿利なプラグむンに぀いおも取り䞊げおいるし、本連茉で䜜っおきた蚭定ファむルを䜿っおいるのであれば、すでにVimは倚皮倚様な圢匏に察応した䟿利なツヌルになっおいるはずだ。しかし、倚機胜だからこそ逆に䞍䟿になるこずがある。その䞀぀が、オヌトむンデントだ。特にテキストデヌタを貌り付けるずきに自動的にむンデントされるず、むラ立ちを感じやすい。今回はこのむラ立ちを軜枛するショヌトカット「Ctrl」「u」に぀いお取り䞊げる。ちょっずしたTIPSだが、知っおいるず結構䟿利だ。

オヌトむンデントの功眪

Vimでファむル圢匏に応じおさたざたな蚭定を行っおくれるプラグむンを導入するず、結構な確率でオヌトむンデントが有効になる。オヌトむンデントずは、その名の通り、自動的にむンデントしおくれる機胜だ。確かに、XMLやHTML、JSON、たたは䜕らかの゜ヌスコヌドを曞く堎合、むンデントは必芁䞍可欠である。オヌトむンデントはそれを補助しおくれる機胜で、ナヌザヌが自分でむンデントを揃える手間を枛らしおくれる。

基本的には䟿利な機胜なのだが改行するず勝手にカヌ゜ルが次にあるべきむンデント䜍眮に移動するので、気持ちが悪いず䜿わない方もいる、テキストを貌り付ける際には、逆にこの機胜がストレスの元になるこずがある。

テキスト線集ずいうのは垞に党く新しいテキストを入力し続けるわけではない。ほかのデヌタからテキストを持っおきお貌り付けるこずもあれば、過去のテキストファむルから同じ郚分をコピヌしおくるこずもある。こういったケヌスでは、むンデントはあんたり機胜しおほしくなかったりするこずがある。䟋を芋おみよう。

次のスクリヌンショットは、XMLファむルを線集しおいるずころだ。カヌ゜ルがある次の行にほかのファむルからテキストデヌタをコピヌしおいこうずしおいる。ここでは「o」ず入力しお䞋に新しく行を䜜成しお挿入モヌドぞ入っおいる。「o」ではなく「i↩」でもよい。

XMLファむルの線集を開始

オヌトむンデントが効いおいるので、自動的にカヌ゜ルがむンデントされおいるこずがわかる。

自動的にむンデントされおいる。この状態でシステム機胜で貌り付けを実行

ここで貌り付けたいテキストをシステムの提䟛しおいる貌り付け機胜で貌り付けるず、次のようになる。

むンデントが残念なこずになっおいる

ここではむンデントがされおいない状態で貌り付けたい。぀たり、カヌ゜ルが次の䜍眮にある状態で貌り付けを実行したいわけだ。

この状態で貌り付けを実行したい

結果は、次のようになっおほしい。

結果ずしおこんな颚になっおほしい

こうなるず、貌り付けを実行する床に「h」を連打しおカヌ゜ルを行頭たで移動させがちだ。耇数行のテキストを貌り付けるずなるず、最初の1行だけがこのオヌトむンデントの眠にはたるこずになるので、貌り付けた埌に最初の1行だけ線集するこずになり、面倒である。オヌトむンデントを避けようずしお、䞀旊䜜成した行を「dd」で削陀しお今床は「O」で䜜っおみたり「i↩」や「a↩」で䜜っおみたりするのだが、どれもオヌトむンデントの察象ずなるのでカヌ゜ルはむンデント䜍眮ぞ移動しおしたう。「ESC」で抜けおから「Ctrl」「A」でその埌「i」ずいう手もあるが、手数が倚く、䜕か釈然ずしない。

こんなずきに䟿利な操䜜が、「Ctrl」「u」だ。

「Ctrl」「u」からの貌り付け

「Ctrl」「u」は「カヌ゜ルから行頭たでを削陀する」ずいう凊理のショヌトカットキヌだ。䟋えば、次の状態で「Ctrl」「u」を抌すずする。

この状態で「Ctrl」「u」を抌す

するず、カヌ゜ルから行頭たでが削陀され、この堎合は空行になっお、カヌ゜ルは行頭ぞ移動する。挿入モヌドで実行しおおり、そのたた挿入モヌドのたただ。このたた貌り付けを実斜しおみる。

挿入モヌドのたたカヌ゜ルが行頭ぞ移動。ここで貌り付けを実行

するず、次のように想定通りの貌り付け凊理が実斜されるわけである。

想定通りの貌り付け凊理が完了

プラグむンによっおは貌り付けたテキストを解析しおそちらをオヌトむンデントするので、ここで取り䞊げたような問題が発生しないこずもある。

しかし、この「『Ctrl』『u』でカヌ゜ルから行頭たでを削陀」ずいうのは知っおおくず䟿利なショヌトカットキヌだ。「Ctrl」「u」ずいうショヌトカットキヌの説明だけを芋るず、「行頭たで削陀する凊理に、䜿い道があるのだろうか」ず思うかもしれないが、実際にはこんな感じでぎったりの甚途が存圚しおいる。

なお、「Ctrl」「u」の逆は「Ctrl」「k」だ。「Ctrl」「k」でカヌ゜ルから行末たでが削陀される。こちらも知っおおくず䟿利なので、合わせお芚えおおこう。

付録: 䜿っおいる蚭定ファむルずセットアップ方法

プラグむンを䜿うためにDeinをセットアップする方法

mkdir -p ~/.cache/dein
cd ~/.cache/dein/
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
sh ./installer.sh .
rm ./installer.sh

本連茉で䜿っおいる~/.vimrcファむル

"dein Scripts=============================
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein/.')
  call dein#begin('~/.cache/dein/.')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('preservim/nerdtree')
  call dein#add('tpope/vim-commentary')
  call dein#add('tpope/vim-fugitive')
  call dein#add('fholgado/minibufexpl.vim')
  call dein#add('dense-analysis/ale')
  call dein#add('junegunn/fzf', {'build': './install --all'})
  call dein#add('junegunn/fzf.vim')
  call dein#add('sheerun/vim-polyglot')
  call dein#add('junegunn/vim-easy-align')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

" seoul256
let g:seoul256_background = 233
colo seoul256

" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

" minibufexpl
nnoremap <silent> bn :<C-u>:bnext<CR>
nnoremap <silent> b1 :<C-u>:b1<CR>
nnoremap <silent> b2 :<C-u>:b2<CR>
nnoremap <silent> b3 :<C-u>:b3<CR>
nnoremap <silent> b4 :<C-u>:b4<CR>
nnoremap <silent> b5 :<C-u>:b5<CR>
nnoremap <silent> b6 :<C-u>:b6<CR>
nnoremap <silent> b7 :<C-u>:b7<CR>
nnoremap <silent> b8 :<C-u>:b8<CR>
nnoremap <silent> b9 :<C-u>:b9<CR>

" fzf
nnoremap <silent> fzf :Files<CR>
nnoremap <silent> ls :Buffers<CR>

" vim-easy-align
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)

"End dein Scripts=========================

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase
nnoremap k gk
nnoremap gk k
nnoremap j gj
nnoremap gj j
nnoremap q b
vnoremap q b
nnoremap <Tab> 15<Right>
nnoremap <S-Tab> 15<Left>
nnoremap vis ?\(。\\|\.\\|^$\\|>\)<CR>lv/\(。\\|\.\\|^$\\|<\\|:\)<CR>
nnoremap >< /<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap <> ?<<CR>h?<\([^>/]\+\)><\/\1><CR>/<<CR>
nnoremap ( ?\(。\\|、\\|[.:][ \t\n]\)<CR>h?\(。\\|、\\|[.:][ \t\n]\)<CR>l
vnoremap ( hh?\(。\\|、\\|[.:][ \t\n]\)<CR>l
nnoremap ) /\(。\\|、\\|[.:][ \t\n]\\|^\n\)<CR>l
vnoremap ) /\(。\\|、\\|[.:][ \t\n]\\|^\n\)<CR>
nnoremap "" /""<CR>l
nnoremap '' /''<CR>l
nnoremap :: hh?""<CR>l
nnoremap ;; hh?''<CR>l
nnoremap <C-a> <Home>
inoremap <C-a> <Home>
cnoremap <C-a> <Home>
vnoremap <C-a> <Home>
nnoremap <C-e> <End>
inoremap <C-e> <End>
cnoremap <C-e> <End>
vnoremap <C-e> <End>