マイナビニュースマイナビ

Vimを使う - インデントと折り畳みを使う

【連載】

にわか管理者のためのLinux運用入門

【第267回】Vimを使う - インデントと折り畳みを使う

[2021/02/09 08:00]後藤大地 ブックマーク ブックマーク

前回は、ビジュアル行選択したエリアを折り畳み、一時的に表示を隠しておくことができる機能を取り上げた。使用するシーンは限られているものの、知っておくと便利な機能だ。今回はこの機能の応用編として、インデント単位で表示を折り畳む方法を取り上げる。

インデント単位で折り畳む

インデントが最も使われるのは、プログラムのソースコードではないかと思う。XMLやJSONなどは、表記ルールとしてはインデント必要ないが、人間の可読性を高める目的でインデントされていることも多い。また、プログラミング言語の中には、Pythonのように表記ルールとしてインデントが必須のものもある。そうしたデータについては、インデント単位で折り畳むというVimの機能が威力を発揮する。

インデント単位で折り畳むサンプル

Vimのデフォルトの設定では、折り畳みの対象は手動で指定するようになっており、この挙動は「foldmethod」の値によって変更することができる。インデント単位で折り畳みを行うには、「foldmethod」の値に「indent」を設定する。

「foldmethod」の値に「indent」を設定

「foldmethod」の値に「indent」を設定すると、次のようにインデントされている全てのデータが折り畳まれるはずだ。このままだと動きの説明がしにくいので、一旦「zR」で折り畳みを全部展開しよう。

「zR」で一旦折り畳みを全部展開

これで次のように出発点へ戻ってくる。

説明するための状態に戻ってきた

「インデント単位で折り畳む」というのは、「インデントの数を指定して、その数およびそれよりも深いインデントをすべて折り畳む」という意味だ。そしてインデントの数(数というか深さ、またはレベル)は「foldlevel」で指定する。次のスクリーンショットでは「foldlebel」を「0」に設定している。

「foldlevel」を「0」へ設定する

実行すると次のようになる。

「foldlevel=0」の結果

「foldlevel=0」で、インデントしていない行以外の行が全て折り畳まれていることがわかる。以下に、foldlevelをそれぞれ「1」「2」「3」に設定した場合の結果を示す。

「foldlevel=1」の結果

「foldlevel=2」の結果

「foldlevel=3」の結果

このようにインデントの深さを指定すると、指定した値以上の深さのインデントがまとめて折り畳まれるようになる。

「foldmethod」を「indent」に設定した場合のこの挙動は、適用されるシーンがある程度限定される。しかし、その限られたシーンにおいては必要なデータを一瞥できる状態を作ることができ、とても便利なので覚えておきたい。

なお、「foldmethod」のデフォルト値は「manual」だ。変更した操作を「ビジュアル行選択して折り畳む」という操作に戻したい場合は、「foldmethod」の値を「manual」に設定し直せばよい。

付録: 使っている設定ファイルとセットアップ方法

プラグインを使うために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>

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で TECH+ の人気記事をお届けします
注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
Slackで始める新しいオフィス様式
Google Workspaceをビジネスで活用する
ニューノーマル時代のオウンドメディア戦略
ミッションステートメント
次世代YouTubeクリエイターの成長戦略
教えてカナコさん! これならわかるAI入門
AWSではじめる機械学習 ~サービスを知り、実装を学ぶ~
Kubernetes入門
SAFeでつくる「DXに強い組織」~企業の課題を解決する13のアプローチ~
AWSで作るマイクロサービス
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

会員登録(無料)

ページの先頭に戻る