Tips

Nvim :help ページは、このスクリプトを使用して、ソースから tree-sitter-vimdoc パーサーで生成されています。


Vim を使用する際のヒントとアイデア
これらは、多くのユーザーにとって役立つと思われるヒントの一部です。wiki には、さらに多くのヒントがあります。URL は https://www.vim.org にあります。
ユーザーマニュアルを参照することを忘れないでください。そこにも多くの役立つヒントが記載されています usr_toc.txt

C プログラムの編集 C プログラムの編集

Vim には、C プログラムファイルの編集に役立つ機能が多数あります。概要とジャンプ先タグを以下に示します。
usr_29.txt ユーザーマニュアルのプログラム内移動の章。 usr_30.txt ユーザーマニュアルのプログラム編集の章。 C のインデント テキスト入力中に自動的に行のインデントを設定します。 = いくつかの行を再インデントします。 コメントのフォーマット コメントをフォーマットします。
:checkpath 再帰的にインクルードされたすべてのファイルを表示します。 [i 現在のファイルとインクルードされたファイルで、カーソル下の識別子を検索します。 [_CTRL-I "[i" の一致箇所にジャンプします。 [I 現在のファイルとインクルードされたファイルで、カーソル下の識別子に一致するすべての行をリストします。 [d 現在のファイルとインクルードされたファイルで、カーソル下の define を検索します。
CTRL-] カーソル下のタグ(例えば、関数の定義)にジャンプします。 CTRL-T CTRL-] コマンドを実行する前の位置に戻ります。 :tselect 一致するタグのリストから1つのタグを選択します。
gd カーソル下のローカル変数の宣言に移動します。 gD カーソル下のグローバル変数の宣言に移動します。
gf カーソル下のファイル名に移動します。
% 対応する (), {}, [], /* */, #if, #else, #endif に移動します。 [/ 前のコメントの開始位置に移動します。 ]/ 次のコメントの終了位置に移動します。 [# 閉じられていない #if、#ifdef、または #else に戻ります。 ]# 閉じられていない #else または #endif に進みます。 [( 閉じられていない '(' に戻ります。 ]) 閉じられていない ')' に進みます。 [{ 閉じられていない '{' に戻ります。 ]} 閉じられていない '}' に進みます。
v_ab "["(" から "])" まで、ブレースを含む "ブロック" を選択します。 v_ib "["(" から "])" までの "内部ブロック" を選択します。 v_aB "{" から "}" まで、ブラケットを含む "ブロック" を選択します。 v_iB "{" から "}" までの "内部ブロック" を選択します。

識別子が使用されている場所を見つける 識別子の検索

タグ を使用して、関数や変数が定義されている場所にジャンプできることは、おそらくすでにご存知でしょう。しかし、関数や変数が使用されているすべての場所にジャンプしたい場合があります。これは、次の 2 つの方法で可能です。1. :grep コマンドを使用する。これはほとんどの Unix システムで動作しますが、低速(すべてのファイルを読み取る)で、1 つのディレクトリ内のみを検索します。2. ID ユーティリティを使用する。これは高速で、複数のディレクトリで動作します。場所を格納するためにデータベースを使用します。これを使用するには、いくつかの追加プログラムが必要になります。また、データベースを最新の状態に保つ必要があります。
GNU id-tools を使用する
必要なもの
GNU id-tools がインストールされていること (ID を作成するには mkid が、マクロを使用するには lid が必要です)。
現在のディレクトリに "ID" という識別子データベースファイルがあること。シェルコマンド "mkid file1 file2 .." で作成できます。
これを init.vim に追加します。
map _u :call ID_search()<Bar>execute "/\\<" .. g:word .. "\\>"<CR>
map _n :n<Bar>execute "/\\<" .. g:word .. "\\>"<CR>
function! ID_search()
  let g:word = expand("<cword>")
  let x = system("lid --key=none " .. g:word)
  let x = substitute(x, "\n", " ", "g")
  execute "next " .. x
endfun
これを使用するには、カーソルを単語の上に置き、"_u" と入力すると、vim はその単語を含むファイルをロードします。"n" で同じファイル内の単語の次の出現箇所を検索します。"_n" で次のファイルに移動します。
これは id-utils-3.2 (これは、最寄りの gnu-ftp-mirror にある id-tools アーカイブファイルの名前です) でテストされています。
[このアイデアは Andreas Kutschera からのものです]

挿入モードでのスクロール 挿入モードでのスクロール

挿入モードで、画面から少し外れた部分を見たい場合は、CTRL-X CTRL-ECTRL-X CTRL-Y を使用して画面をスクロールできます。 i_CTRL-X_CTRL-E
これを簡単にするために、これらのマッピングを使用できます。
:inoremap <C-E> <C-X><C-E>
:inoremap <C-Y> <C-X><C-Y>
ただし、これにより、カーソルの上下にある行からテキストをコピーする機能が失われます i_CTRL-E
また、'scrolloff' をより大きな値に設定して、カーソル周辺のコンテキストを常に表示できるようにすることを検討してください。'scrolloff' がウィンドウの高さの半分より大きい場合、カーソルは常に中央に配置され、カーソルが上下に移動するとテキストがスクロールされます。

スムーズスクロール スムーズスクロール

スクロールをもう少しスムーズにしたい場合は、これらのマッピングを使用できます。
:map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y>
:map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E>

よくある入力ミスの修正 入力ミスの修正

間違った方法で入力し続ける単語がいくつかある場合は、それらを修正する省略形を作成します。例えば
:ab teh the
:ab fro for

単語、行などを数える 項目のカウント

現在のバッファに任意のパターンが何回出現するかをカウントするには、置換コマンドを使用し、置換を回避するために 'n' フラグを追加します。報告される置換の数は、項目の数です。例
:%s/./&/gn                characters
:%s/\i\+/&/gn                words
:%s/^//n                lines
:%s/the/&/gn                "the" anywhere
:%s/\<the\>/&/gn        "the" as a word
'hlsearch' をリセットするか、":nohlsearch" を実行することをお勧めします。一致がない場合にエラーが発生しないようにするには、'e' フラグを追加します。
別の方法としては、ビジュアルモードで v_g_CTRL-G を使用する方法があります。
複数のファイルで一致を検索する場合は、:vimgrep を使用します。
バイト数を数える
バイト数をカウントする場合は、これを使用できます。
文字をビジュアル選択する(ブロックも可能です) "y" を使用して文字をヤンクする strlen() 関数を使用する
:echo strlen(@")
改行は 1 バイトとしてカウントされます。

カーソル位置の復元 カーソル位置の復元

ファイルのどこかを変更し、テキストをスクロールせずにカーソル位置を復元するマッピングを作成したい場合があります。たとえば、ファイルの日付マークを変更するには
:map <F2> msHmtgg/Last [cC]hange:\s*/e+1<CR>"_D"=strftime("%Y %b %d")<CR>p'tzt`s
位置の保存を分割する: ms カーソル位置を 's' マークに保存する H ウィンドウの最初の行に移動する mt この位置を 't' マークに保存する
位置の復元を分割する: 't 前回ウィンドウの先頭にあった行に移動する zt スクロールしてこの行をウィンドウの先頭に移動する s カーソルの元の位置にジャンプする
より高度な方法については、winsaveview()winrestview() を参照してください。

ファイルの名前変更 ファイルの名前変更

たとえば、次のファイルを含むディレクトリがあるとします (ディレクトリはランダムに選択されています :-) )
buffer.c charset.c digraph.c

...

そして、*.c*.bla に名前変更したいとします。次のようにします。
$ vim
:r !ls *.c
:%s/\(.*\).c/mv & \1.bla
:w !sh
:q!

複数のファイルで名前を変更する 名前の変更

スクリプトファイルを使用して複数のファイルの名前を変更する例
置換コマンドと :update コマンドを含むファイル "subs.vim" を作成します。
:%s/Jones/Smith/g
:%s/Allen/Peter/g
:update
変更したいすべてのファイルに対して Vim を実行し、各引数に対してスクリプトをソースします。
vim *.let
argdo source subs.vim
:argdo を参照してください。

外部コマンドの高速化 高速化

状況によっては、外部コマンドの実行が非常に遅くなることがあります。これは、Unix でのワイルドカード展開も遅くする可能性があります。速度を上げるためのヒントをいくつか紹介します。
.cshrc (または使用しているシェルに応じて他のファイル) が非常に長い場合は、対話型使用のセクションと非対話型使用 (多くの場合、セカンダリシェルと呼ばれます) のセクションに分割する必要があります。Vim から ":!ls" のようなコマンドを実行する場合、対話型の処理 (たとえば、プロンプトの設定) は必要ありません。不要なものは、これらの行の後に配置します。
if ($?prompt == 0) then
        exit 0
endif
もう 1 つの方法は、'shell' オプションに "-f" フラグを含めることです。例:
:set shell=csh\ -f
(バックスラッシュは、オプションにスペースを含めるために必要です)。これにより、csh は .cshrc ファイルの使用を完全にスキップします。ただし、これにより、一部の機能が動作しなくなる可能性があります。

便利なマッピング 便利なマッピング

一部の人が好んで使用するマッピングをいくつか紹介します。
バッククォートのマッピング
:map ' `
シングルクォートをバッククォートのように動作させます。行の最初の空白以外の文字に移動する代わりに、マークの列にカーソルを置きます。
Emacs キー
コマンドラインで Emacs スタイルの編集を行う場合
" start of line
:cnoremap <C-A>                <Home>
" back one character
:cnoremap <C-B>                <Left>
" delete character under cursor
:cnoremap <C-D>                <Del>
" end of line
:cnoremap <C-E>                <End>
" forward one character
:cnoremap <C-F>                <Right>
" recall newer command-line
:cnoremap <C-N>                <Down>
" recall previous (older) command-line
:cnoremap <C-P>                <Up>
" back one word
:cnoremap <Esc><C-B>        <S-Left>
" forward one word
:cnoremap <Esc><C-F>        <S-Right>
箇条書きのフォーマット
このマッピングは、任意の箇条書きをフォーマットします。各リストエントリの上下に空行が必要です。式コマンドは、マッピングの各部分にコメントを付けることができるようにするために使用されます。
:let m =     ":map _f  :set ai<CR>"   " need 'autoindent' set
:let m ..= "{O<Esc>"                      " add empty line above item
:let m ..= "}{)^W"                      " move to text after bullet
:let m ..= "i     <CR>     <Esc>"     " add space for indent
:let m ..= "gq}"                      " format text after the bullet
:let m ..= "{dd"                      " remove the empty line
:let m ..= "5lDJ"                      " put text after bullet
:execute m                              |" define the mapping
(<> 表記 <>。これはすべて文字通りに入力されることに注意してください。^W は "^" "W" で、

CTRL-W ではありません。)

最後のコメントは |" で始まっていることに注意してください。これは、":execute" コマンドがコメントを直接受け入れないためです。
また、'textwidth' をゼロ以外の値に設定する必要があります。例:
:set tw=70
ほぼ同じことを行いますが、リストのインデントを最初の行から取得するマッピング (注: このマッピングは、多くのスペースを含む 1 つの長い行です)
:map _f :set ai<CR>}{a                                                          <Esc>WWmmkD`mi<CR><Esc>kkddpJgq}'mJO<Esc>j
折りたたみ
これら 2 つのマッピングは、一連の空行 (;b) または空白行 (;n) を 1 行に減らします。
:map ;b   GoZ<Esc>:g/^$/.,/./-j<CR>Gdd
:map ;n   GoZ<Esc>:g/^[ <Tab>]*$/.,/[^ <Tab>]/-j<CR>Gdd

ヘルプファイルの圧縮 ヘルプファイルの圧縮

ディスク容量が非常に不足している場合は、ヘルプファイルを圧縮しても Vim で表示できます。これにより、ヘルプファイルへのアクセスが少し遅くなり、"gzip" プログラムが必要になります。
(1) すべてのヘルプファイルを圧縮します: "gzip doc/*.txt"。
(2) "doc/tags" を編集し、".txt" を ".txt.gz" に変更します。
:%s=\(\t.*\.txt\)\t=\1.gz\t=
(3) vimrc に次の行を追加します。
set helpfile={dirname}/help.txt.gz
ここで、{dirname} はヘルプファイルがあるディレクトリです。gzip プラグインは、ファイルの解凍を処理します。圧縮された "doc" ディレクトリと同じ場所にない場合、$VIMRUNTIME が他の Vim ファイルがある場所に設定されていることを確認する必要があります。$VIMRUNTIME を参照してください。
ユーザーマニュアルのセクション 23.3 を参照してください。
バイナリファイル(exe、binなど)に特定の拡張子を使用している場合、init.vim に次の autocmd を記述してプロセスを自動化すると便利です。 "*.bin" は、編集したい拡張子のカンマ区切りのリストに変更してください。
" vim -b : edit binary using xxd-format!
augroup Binary
  autocmd!
  autocmd BufReadPre  *.bin set binary
  autocmd BufReadPost *.bin
    \ if &binary
    \ |   execute "silent %!xxd -c 32"
    \ |   set filetype=xxd
    \ |   redraw
    \ | endif
  autocmd BufWritePre *.bin
    \ if &binary
    \ |   let s:view = winsaveview()
    \ |   execute "silent %!xxd -r -c 32"
    \ | endif
  autocmd BufWritePost *.bin
    \ if &binary
    \ |   execute "silent %!xxd -c 32"
    \ |   set nomodified
    \ |   call winrestview(s:view)
    \ |   redraw
    \ | endif
augroup END

autocommands での <> 記法の使用 autocmd-<>

<> 記法は :autocmd の引数では認識されません。特殊文字を使用せずに <> 記法を取得するには、自己破壊マッピングを使用して、autocmd からマッピングを呼び出すことができます。例:
自己破壊マッピング
" This is for automatically adding the name of the file to the menu list.
" It uses a self-destroying mapping!
" 1. use a line in the buffer to convert the 'dots' in the file name to \.
" 2. store that in register '"'
" 3. add that name to the Buffers menu list
" WARNING: this does have some side effects, like overwriting the
" current register contents and removing any mapping for the "i" command.
"
autocmd BufNewFile,BufReadPre * nmap i :nunmap i<CR>O<C-R>%<Esc>:.g/\./s/\./\\./g<CR>0"9y$u:menu Buffers.<C-R>9 :buffer <C-R>%<C-V><CR><CR>
autocmd BufNewFile,BufReadPre * normal i
おそらくより良い別の方法は、":execute" コマンドを使用することです。文字列内で、<> 記法の前にバックスラッシュを付けることで使用できます。既存のバックスラッシュの数を 2 倍にし、'"' の前にバックスラッシュを付けることを忘れないでください。
autocmd BufNewFile,BufReadPre * exe "normal O\<C-R>%\<Esc>:.g/\\./s/\\./\\\\./g\<CR>0\"9y$u:menu Buffers.\<C-R>9 :buffer \<C-R>%\<C-V>\<CR>\<CR>"
実際のバッファメニューには、ユーザー関数を使用する必要があります(:function を参照)。ただし、その場合は <> 記法は使用されないため、ここでは例として使用できません。

一致する括弧の強調表示 match-parens

この例では、いくつかの高度なテクニックの使用法を示します。
CursorMoved autocommand イベントの使用
一致する括弧を見つけるための searchpairpos() の使用
カーソルが文字列またはコメント内にあるかどうかを検出するための synID() の使用
何かを強調表示するための :match の使用
ファイル内の特定の位置に一致させるための パターン の使用
これは、スクリプトローカル変数を使用するため、Vim スクリプトファイルに配置する必要があります。文字列またはコメント内の一致はスキップされますが、カーソルが文字列またはコメント内で開始された場合は除きます。これには構文の強調表示が必要です。
少し高度なバージョンは、matchparen プラグインで使用されています。
let s:paren_hl_on = 0
function s:Highlight_Matching_Paren()
  if s:paren_hl_on
    match none
    let s:paren_hl_on = 0
  endif
  let c_lnum = line('.')
  let c_col = col('.')
  let c = getline(c_lnum)[c_col - 1]
  let plist = split(&matchpairs, ':\|,')
  let i = index(plist, c)
  if i < 0
    return
  endif
  if i % 2 == 0
    let s_flags = 'nW'
    let c2 = plist[i + 1]
  else
    let s_flags = 'nbW'
    let c2 = c
    let c = plist[i - 1]
  endif
  if c == '['
    let c = '\['
    let c2 = '\]'
  endif
  let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' ..
        \ '=~?        "string\\|comment"'
  execute 'if' s_skip '| let s_skip = 0 | endif'
  let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip)
  if m_lnum > 0 && m_lnum >= line('w0') && m_lnum <= line('w$')
    exe 'match Search /\(\%' .. c_lnum .. 'l\%' .. c_col ..
          \ 'c\)\|\(\%' .. m_lnum .. 'l\%' .. m_col .. 'c\)/'
    let s:paren_hl_on = 1
  endif
endfunction
autocmd CursorMoved,CursorMovedI * call s:Highlight_Matching_Paren()
autocmd InsertEnter * match none

現在のウィンドウでヘルプを開く help-curwin

デフォルトでは、ヘルプは分割ウィンドウに表示されます。現在のウィンドウで開く場合は、このカスタム :HelpCurwin コマンドを試してください。
command -bar -nargs=? -complete=help HelpCurwin execute s:HelpCurwin(<q-args>)
let s:did_open_help = v:false
function s:HelpCurwin(subject) abort
  let mods = 'silent noautocmd keepalt'
  if !s:did_open_help
    execute mods .. ' help'
    execute mods .. ' helpclose'
    let s:did_open_help = v:true
  endif
  if !empty(getcompletion(a:subject, 'help'))
    execute mods .. ' edit ' .. &helpfile
    set buftype=help
  endif
  return 'help ' .. a:subject
endfunction
メイン
コマンド索引
クイックリファレンス