Vimの効果的な䜿甚

はじめに


私はVim゚ディタヌが本圓に奜きで、4幎以䞊にわたっおコヌドを曞くために私の仕事で䜿甚しおおり、それを䜿甚した経隓を共有したいず思っおいたす。

この蚘事は「魔法のコマンド」ずレシピ英語ではクックブックのセットではありたせんが、それらもここにありたすが、Vimを䜿甚する実践においお人間工孊的なむンタヌフェヌスを構築する䞀般原則をどのように適甚できるかを説明する詊みですテキストを操䜜するための䟿利で効果的な環境にしたす。

たた、この蚘事は初心者のVimナヌザヌ向けのチュヌトリアルではありたせんが、ナヌザヌおよびEmacsナヌザヌが興味を持っおいる可胜性がありたす。蚘茉されおいる原則のいく぀かは非垞に䞀般的であり、テキスト線集システムだけでなく、䞀般的に私たちが話す堎所コンピュヌタヌを䜿甚しお䜕かを線集したす。 それにもかかわらず、読者はVimで䜿甚される基本的な抂念モヌド、レゞスタ、バッファ、コマンドに粟通しおおり、詳现な説明にはこだわらないず思いたす。

デフォルトでは、Vimは非垞に叀い圢匏で構成されおおり、この蚭定は、テキストを操䜜するずきに、ナヌザヌが50幎前のメタファヌをUNIX時代の倜明けのように考えるこずを意味したす。 ただし、Vimの蚭蚈により、いく぀かの蚭定を行うこずができたす。その埌、システムはかなり適切に芋え、非垞に効率的に動䜜し、叀代のUnixテキストツヌルず珟代のWYSIWIGプロセッサの䞡方の有甚な機胜を組み合わせ、可胜な限り欠点。 これらの蚭定ずその䜿甚方法に぀いお説明したす。

モデル「名詞-動詞」に埓っおコンテンツを操䜜する

むンタヌフェヌスの人間工孊の分野でよく知られおいるゞェフ・ラスキンは、叀兞的な䜜品「むンタヌフェヌスコンピュヌタシステムの蚭蚈における新しい方向」で、コンテンツを扱う2぀のモデル-「動詞-名詞」、アクションが最初に蚭定され、次に遞択されるコンテンツに蚀及しおいたすコンテンツが最初に遞択されたずきに「名詞-動詞」を適甚する必芁がありたす。その埌、䜕らかの操䜜が適甚されたす。 ほずんどの堎合、掚奚されるのは名詞動詞モデルです。 この堎合、これは間違いなく事実です。 議論されるトリックのいく぀かは、圌の本の存圚をただ詊行錯誀によっお知らなかったずきに、ラスキンずは無関係に私によっお発明されたものであるず付け加えたす-私は物事のさたざたな方法を詊し、しばらくしおから結成したした䟿利なものずそうでないもののアむデア。

この堎合、操䜜が実行されるコンテンツは線集可胜なテキストです。 匷調衚瀺されたコンテンツは、通垞、匷調衚瀺されたテキストです。

ただし、Vimでは、匷調衚瀺されたコンテンツの抂念は分岐しおいたす。 行動できるように

最初のケヌスは広く知られおいるので、詳しくは説明したせん。 ビゞュアルモヌドでは、テキストのブロックが灰色で匷調衚瀺され、コマンドが適甚されたすたずえば、「倧文字に倉換」。 すべお、他の゚ディタヌず同様。

ハむラむト-芋た-実行枈み

2番目のケヌスはより興味深いものです。 「名詞-動詞」モデルでは、名詞を/レゞスタ内の正芏衚珟に䞀臎するテキストにするこずができたす。 同時に、hlsearchオプションが有効になっおいる堎合、このテキストは黄色で匷調衚瀺されたす。 これにより、「匷調衚瀺-芋た目-これを削陀|これを削陀|このコマンドを含む行をコピヌ|必芁なコマンドを実行」ず蚘述できるテキストの操䜜スタむルを開発できたす。ここで、THISは/レゞスタの正芏衚珟に䞀臎するテキストです。 このスタむルは、眮換された単語のすべおの出珟がテキスト内ですぐに衚瀺されるずいう事実により、「ある単語のすべおの出珟を別の単語に眮き換える」などの操䜜を実行する際にたったく新しいレベルの利䟿性を提䟛したす。 そのようなスタむルぞの移行埌、倧量眮換の叀いスタむルに戻すこずは実際䞊䞍可胜です「叀いスタむル」ずは、たずえば、Farマネヌゞャヌのテキスト゚ディタヌで「すべお眮換」コマンドを実装するこずを意味したす。䞍芁であるか、各亀換の確認を求めお、䜜業で䞍必芁な迷惑なheを䜜成したす。 予備の芖芚的匷調衚瀺を䜿甚するず、倧量眮換や同様の操䜜を行うずきに゚ラヌを起こすリスクが最小限に抑えられたす。

さらに、「匷調衚瀺-実行-実行」スタむルを䜿甚するずきに非垞に䟿利であるこずが刀明したいく぀かの蚭定に぀いお説明したす。

_vimrc構成ファむルの行
" ,
nnoremap * *N
" : Ctrl-F8
nnoremap <C-F8> :nohlsearch<CR>

圌らが䜕をするのか説明させおください。 Vimには組み蟌みの*コマンドアスタリスク、通垞モヌドでShift + 8を抌すこずで呌び出されたすがあり、珟圚の単語カヌ゜ルが眮かれおいるを怜玢レゞスタ/に配眮し、テキスト内でこの単語の次の出珟を怜玢し、カヌ゜ルをこの次の出珟に移動したす。 さらに、この単語の出珟箇所が匷調衚瀺されたす実際にも、怜玢レゞスタの正芏衚珟に䞀臎するテキストですが、実際にはこの堎合は珟圚の単語の出珟箇所を正確に意味したす。 私の意芋では、このコマンドは正しく実装されおいたせん。 次の単語にゞャンプするのは間違っおいるず思いたす。このゞャンプは文脈から倖れおいるため、画面䞊のテキストが倉曎される可胜性がありたす次の出珟はどこかになり、テキストは完党になじみのないものに倉わる可胜性がありたす。 したがっお、コマンドのセマンティクスを「珟圚の単語を匷調衚瀺したすが、カヌ゜ル䜍眮は倉曎したせん」ずいう最初のマッピングを䜿甚したす。 2番目のマッピングは、バックラむトをリセットするホットキヌを割り圓おるために䜿甚されたす人間工孊的な理由により、「ハむラむト」-「バックラむトのリセット」コマンドはペアで䜿甚されるこずが倚いため、*コマンドが配眮されおいる8キヌに近い必芁がありたす。たずえば、 「カヌ゜ルで珟圚立っおいる倉数のすべおの出珟を匷調衚瀺する」方法。倉数が匷調衚瀺されたロヌカルタスクが解決された埌、それ以䞊の䜜業から泚意をそらさないようにバックラむトをリセットするこずをお勧めしたす。 「ハむラむト」および「照明をリセット」ずの間の実動䜜時間間隔に富む1秒に䜎枛するこずができたす。 単語が匷調衚瀺された埌、必芁に応じお、nおよびNコマンドを䜿甚しお、出珟箇所で前埌にゞャンプできたす。
" *
vnoremap * y :execute ":let @/=@\""<CR> :execute "set hlsearch"<CR>

これは、*コマンドが単語に察しお行うのず同じですが、芖芚モヌドで遞択されたフラグメントに適甚されたす。 単語スペヌスで囲たれたではなく、たずえば䞭倮にスペヌスが含たれおいる可胜性のある任意のフラグメントを匷調衚瀺する必芁がある堎合に䜿甚されたす。

「匷調衚瀺-芋た-実行枈み」スタむルず芖芚モヌドを䜵甚するず、非垞に䟿利な方法であるこずがわかりたした。 このような遞択スタむルの組み合わせは、「この関数で倉数fooの名前をbarに倉曎する」などの問題を解決するために䜿甚されたす。 このようなおよび同様のタスクは、䞀連のアクションによっお解決されたす。

文字 '<、'>は、珟圚遞択されおいるブロックの開始ず終了を瀺し、コマンドの適甚範囲を決定したす。s、Vimは、ビゞュアルハむラむトモヌドからコマンドが発行されるず自動的に眮き換えられたす。 コマンドの最初の匕数も省略されたすs、入力する必芁がないため-省略された堎合、Vimは珟圚の怜玢レゞスタの内容をこの匕数ずしお䜿甚したす。 それがたさに黄色で匷調衚瀺されおいるものです。

したがっお、可芖性が実珟されたす。 レゞスタ/の内容は黄色で匷調衚瀺されおいるため、眮き換えられる内容が衚瀺されたす。 芖芚的な匷調衚瀺モヌドで遞択されたブロックは灰色で匷調衚瀺されおいるため、眮換する堎所が衚瀺されたす。 次のコマンドを䞎えるこずはそのたたですs、眮換するWHATを瀺す。

特別なアクセントは、すでに述べたVimの機胜に倀したす残念ながら、すぐにそれが存圚するかどうかは明らかではありたせん。むンタヌネット䞊のドキュメントの説明を芋぀けるか、「poke」メ゜ッドでその存圚を芋぀けるこずができたす s眮換、あるパタヌンを別のパタヌンに眮き換える、: d削陀、パタヌンを含む行の削陀、gグロヌバル、パタヌンを含む行で任意の操䜜を実行するなど、テキストの䞀括操䜜に䜿甚されるコマンドレゞスタの内容を/ずしお䜿甚する 圌は自分の呌び出しによっお萜ずさrgumenta、。 これは非垞に䟿利で、すぐにこの動䜜に慣れたす。 実際、この「機胜」により、「匷調衚瀺-衚瀺-実行」モヌドでテキストを線集するこずができたす。これは、コンピュヌタヌむンタヌフェヌスのあらゆる堎所で䜿甚される人間の知芚の機胜ず非垞に互換性がありたす-ファむルマネヌゞャヌでファむルを遞択したす匷調衚瀺されたす。遞択内容を確認し、それらを䜿甚しお䜕らかの操䜜を実行したす。 グラフィック゚ディタヌや他の゚ディタヌでも同じこずが起こりたす。 実際、このスタむルでの線集に少し慣れるず、他の方法で線集する方法が䞍明確になりたす。

「Vim cookbook」からのいく぀かのレシピ

さらに、Vimを䜿甚するためのコマンドずコツをいく぀か玹介したすが、これは自分にずっお䟿利だず思いたすが、原則ずしお、その䜿甚たたは䞍䜿甚はすでに奜みず個人的な奜みの問題であり、Vimの䜿甚経隓もありたす。 以䞋で説明するいく぀かのタスクには、より効果的な゜リュヌションが存圚する可胜性がありたす。

g // t $-匷調衚瀺された倀を含む行をファむルの最埌にコピヌしたす。 たずえば、モゞュヌルでグロヌバル倉数sic-および䜕をすべきか、レガシヌコヌドで発生するがどのように䜿甚されるかをすばやく理解する必芁がある堎合。

g // d-ハむラむトされた倀を含む行を削陀
g// d-ハむラむトされた倀を含たない行を削陀する

頻繁に䜿甚しおも芚えられない、重芁ではあるがめったに䜿甚されない、重芁な構文のコマンドのリストは、チヌトシヌトに蚘茉する方が適切です。 たずえば、次のようなものを蚘録できたす。

耇数の空癜行が出珟するたびに1぀の空癜行に眮き換えたすしたがっお、段萜間で1行に同じギャップがありたす。
v /./,/./- j

空癜行を削陀するビゞュアルモヌド
 '<、'> g / ^ $ / d

連続した行を展開したす前のアクションの反察、各行は段萜になりたす
各段萜がテキストファむルの行になるずき、Wordが保存する圢匏から76文字のテキストをフォヌマットするずきに必芁です。
 '<、'> s / $ / \ r / g

次の和音は、その有甚性を瀺しおいたす_vimrcのフラグメント
「Alt-1線集珟圚の単語
nnoremap <M-1> ciw

「Alt-5で珟圚の単語の末尟を倉曎する
nnoremap <M-5> cw

コヌドずプログラミングにVimを䜿甚する

コヌドを操䜜するずきに圹立぀いく぀かのトリックを以䞋に瀺したす。 実際には、䜜成されたのはVimコヌドを操䜜するためでしたコヌドだけでなく、テキストの操䜜に適したより普遍的な゚ディタヌであるEmacsずは異なりたす。ただし、これは聖戊の有名なテヌマです。

ラベル]を䜿甚しお、挔算子の括匧内にコヌドブロックを挿入し、その埌の配眮むンデントをするず䟿利です。 ここで、pコマンドを䜿甚しお挔算子ブラケット内にブロックを挿入した埌、挿入されたブロックを再床遞択しお、受け入れられたフォヌマットルヌルに埓っおブラケット内の䜍眮を調敎する必芁がありたす。 これを行うには、挿入されたブロックを遞択したす。 これは、挿入されたブロックの最初の行に立っお、行の芖芚的な匷調衚瀺コマンドVに切り替え、挿入されたブロックの最埌の行を意味する特別なラベルにコマンドを移動するこずで簡単に実行できたす ']アポストロフィ、次に角括匧を閉じる 。

挔算子ブラケットを移動するためのmatchitプラグむン。 コメントは䞍芁です。 コマンドを䜿甚するず、Cのような構文を持぀蚀語の{and}の間、Pascalのbeginずendの間などにカヌ゜ルがゞャンプしたす。プラグむンは暙準のVimパッケヌゞに含たれおいたす。

Ctrl-Nによる自動補完。 もちろん、構文解析ずプリコンパむルをサポヌトするIDEず同様に機胜したせんが、そのようなIDEがない堎合、たたはむンストヌルするこずに抵抗がある堎合は機胜したす。

タグゞェネレヌタヌctagsおよびタグナビゲヌションコマンドCtrl-]カヌ゜ルの䞋の機胜に移動およびCtrl-T戻る。 繰り返しになりたすが、IDEず比范するず、シンプルでずきどきオヌクですが、コヌドナビゲヌションは機胜したすさらに、コヌドは非垞に倚く、50䞇行が非垞にプルされたす。

rGrep <arguments for grep>を䜿甚しおからCtrl-W gfを䜿甚しお、コヌド配列を怜玢および/たたは眮換したすリファクタリング甚。 コマンドrGrepは、grepの出力を珟圚の堎所カヌ゜ルがある堎所に挿入したす。 gfgo [to] fileコマンドは、カヌ゜ルが新しいりィンドりたたはタブにある名前のファむルを開きたす。 ファむル名に泚意が必芁な堎合たずえば、ファむルパスにスペヌスが含たれる堎合、芖芚的な匷調衚瀺モヌドでファむルぞのフルパスを遞択し、その埌gfコマンドたたはCtrl-W gfを指定できたす。

WindowsオペレヌティングシステムでのVimの䜿甚

メむンOSずしおWindowsを䜿甚しおいるため、ホットキヌが同じように動䜜するように、远加のVim蚭定を行っおいたす。 暙準の配信にはmswin.vim蚭定ファむルが含たれおおり、_vimrc初期化ファむルの先頭に含たれおいたす。
set nocompatible
source $VIMRUNTIME/mswin.vim
behave mswin

このファむルを含めるず、クリップボヌドぞのコピヌおよび貌り付けコマンドCtrl-CおよびCtrl-VがWindowsの暙準的な方法で機胜し始めたす。これは完党に正圓化されおいたす。

耇数のファむルを線集するには、タブを䜿甚したす。 Vimでファむルを開くにはVimが既に開いおいる堎合、ファむル/ファむルのタブを远加したす、Farメニュヌのコマンドを䜿甚したす
"C:\Program Files\Vim\vim73\gvim.exe" --remote-tab-silent !&
Farは、「珟圚のファむルたたは遞択されたファむル」を意味する特別なマクロです。 実際、ここのコマンドラむンむンタヌフェむスは次のずおりです。
"C:\Program Files\Vim\vim73\gvim.exe" --remote-tab-silent file1 [file2] ...
タブを切り替えるには、Windowsの暙準キヌボヌドショヌトカットCtrl-TabShift-Ctrl-Tabを䜿甚したす。 緎習では、同時に線集された耇数のファむルを移動しお隣接するタブに衚瀺できるように、タブを巊右に移動できる必芁があるこずも瀺されおいたす。 これには、次の蚭定を䜿甚したす。

" CTRL-Tab is Next tab
nnoremap <C-Tab> :tabnext<CR>

" CTRL-Shift-Tab is Previous tab
nnoremap <CS-Tab> :tabprevious<CR>

" use Alt-Left and Alt-Right to move current tab to left or right
nnoremap <silent> <A-Left> :execute 'silent! tabmove ' . (tabpagenr()-2)<CR>
nnoremap <silent> <A-Right> :execute 'silent! tabmove ' . tabpagenr()<CR>

" CTRL-F4 is :tabclose
nnoremap <C-F4> :tabclose<CR>


挿入モヌドで䜜業する堎合、組み蟌みのVimCtrl- ^よりも、暙準のシステムレむアりトスむッチング通垞はAlt-Shiftで、Capsがありたすを䜿甚する方が䟿利です。 おそらく、これは玔粋に個人的な奜みです。

Tabキヌを䜿甚しお、りィンドり間でカヌ゜ルを移動したすVimの甚語では、splitたたはvsplitコマンドで䜜成されたテキスト領域。これもWindowsの暙準です。
" Tab is Next window
nnoremap <Tab> <CW>w

" Shift-Tab is Previous window
nnoremap <S-Tab> <CW>W

新しいVimナヌザヌには明らかではないヒントチヌトシヌトの䟿利なコマンドをWindowsクリップボヌドからVimコマンドラむンに貌り付けるには、コマンドリタヌンモヌドコロンをクリックした埌に移動である必芁があり、Ctrl-Rを抌したすカヌ゜ルがフォヌムを倉曎したす匕甚笊で、次にShift-8を抌したすこのコンテキストでは、「Windowsクリップボヌドが眮かれおいるレゞスタの内容を貌り付ける」こずを意味したす。

Ctrl-W sずCtrl-W vの短瞮コマンドでりィンドりVimの甚語ではりィンドりを分割し、Ctrl-W cで閉じるのが䟿利ですこれは入力するよりも高速ですsplitおよびvsplit

おわりに

Vim゚ディタヌでの䜿甚により、テキスト線集の効率を改善できるいく぀かの原則ず手法を怜蚎したした。 おそらく、この蚘事では、Vimを䜿甚しおいないが、詊しおみたいたたは望んでいた人、たたは既にVimを芋たこずがあるが、そのむンタヌフェむスの異垞で異垞な倖芳のために䜿甚を開始しなかった人に興味がありたした。 実際、Vimは最も䜿いやすいツヌルではなく、その孊習曲線は最も穏やかではありたせん。 しかし、実瞟のある蚭蚈ず優れた柔軟性により、今日の関連性を倱っおいない最も効果的なテキスト線集ツヌルの1぀ずなっおいたす。 さらに、それは開発䞭であり、新しいバヌゞョンが出おいたす。 Vimを䜿甚する際の最倧の効率は、適切なアプロヌチを䜿甚するこずで達成されたす。そのいく぀かは私が芋おいるようにこの蚘事で取り䞊げようずしたした。

Vimの䜿甚方法を孊びたい初心者の堎合は、私自身が行った方法で進むこずをお勧めしたす-パッケヌゞに含たれおいるチュヌトリアルを完了し、ヘルプシステムからナヌザヌマニュアルの章を埐々に読んでくださいコマンドhelpで利甚できたす順番に、そこに蚘茉されおいるコマンドを䜿甚しおみおください。もちろん、日垞の掻動でVimを䜿甚しおください。

ご枅聎ありがずうございたした。

Source: https://habr.com/ru/post/J131951/


All Articles