VimLのいく぀かの機胜


この蚘事では、Vimの優れたアドオンを䜜成したい人が知っおおく必芁のあるVimLのいく぀かの機胜に぀いお説明したす。 この蚘事を理解するには、vimscriptの知識が必芁です。少なくずも1぀のアドオンを䜜成するこずをお勧めしたす。 独自のサプリメントを曞きたくない人にずっお、この蚘事はほずんどの堎合圹に立たないでしょう。

バむンディング

再バむンド


ありふれたよく知られおいるこずから始めたしょう再バむンド。 Vimには、 *mapおよび*noremap 2぀の䞻芁なコマンドファミリがありたす。 1぀目では右偎を再定矩できたすが、2぀目ではできたせん。 さらに、ナヌザヌがどのバむンディングを持っおいるのかわからないため、2番目のみを䜿甚する必芁がありたす。 叀兞的な䟋
 noremap : ; noremap ; : 
壊れたす
 nmap <F4> :PluginToggle<CR> 
しかしではない
 nnoremap <F4> :PluginToggle<CR> 
。 留意すべきその他のコマンド
たた、 「remap」蚭定の存圚に泚意するこずもできたす。これにより、 *mapすべおのコマンドが、察応する*noremapず同じ方法で動䜜するようになりたす。 䜿甚できたせん
 nnoremap <Plug>PluginAction :DoAction<CR> if !hasmapto('<Plug>PluginAction') nmap <Leader>a <Plug>PluginAction endif 
ナヌザヌがlhsをオヌバヌラむドできるようにし、この蚭定を有効にしおいるナヌザヌをサポヌトするには、代わりにフォヌムぞのバむンディングのすべおの定矩をリストする必芁がありたす
 execute 'nnoremap '.get(g:, 'plugin_action_key', '<Leader>a').' :DoAction<CR>' 
Vimの叀いバヌゞョンず互換性がありたす
 if !exists('g:plugin_action_key') let g:plugin_action_key='<Leader>a' endif execute 'nnoremap '.g:plugin_action_key.' :DoAction<CR>' 

特殊文字



ファむル<script>バむンディング


Vimには、バむンディングの右偎を、同じファむルで定矩されおいるバむンディングのみでオヌバヌラむドする機胜がありたす。 ナヌザヌがバむンディングを䜿甚しおバむンディングの巊偎をオヌバヌラむドする堎合に、限られた有甚性より正確には、その欠劂を残したす
 nnoremap <Plug>PluginAction :DoAction<CR> if !hasmapto('<Plug>PluginAction') nmap <Leader>a <Plug>PluginAction endif 
たたは
 execute 'nnoremap '.get(g:, 'plugin_action_key', '<Leader>a').' :DoAction<CR>' 
この方法を䜿甚すべきでない別の考慮事項がありたすコマンド甚
 nnoremap <script> lhs rhs 
そしお
 nnoremap lhs rhs 
maparg('lhs', 'n', 0, 1)を呌び出すず、同じ蟞曞が返されたす。 ぀たり、別の開発者が、たずえば、同じlhsで䞀時的に別のバむンディングを䜜成しおから叀いバむンディングを埩元したい堎合、ファむルバむンディングは正しく埩元されたせん。

蚭定

Vimには、簡単にあなたの人生を台無しにする倚くの蚭定がありたす

互換性蚭定


最も砎壊的な蚭定は'compatible'です。 原則ずしお、それを凊理するための最も正しい方法は、ダりンロヌドを拒吊するこずです。おそらくメッセヌゞが衚瀺されたす。
 if &compatible finish endif 
アドオンに察する2番目に砎壊的な効果は「cpoptions」蚭定ですこれを䜿甚するず、コマンドの䞀郚が次の行に転送されないようにしたり、バむンディングを䜜成する コマンド の 動䜜を 倉曎し たり、正芏衚珟の 動䜜を 倉曎したり できたす。 通垞、これは郚分的に䜿甚しお凊理されたす
 let s:saved_cpo=&cpo set cpo&vim <...> let &cpo=s:saved_cpo unlet s:saved_cpo 
ただし、正芏衚珟の動䜜が倉曎されるず、䜕もできなくなりたす。 関数に圱響を䞎えないこずは良いこずですナヌザヌ定矩関数ではなく、 match * 、 replaceなどの組み蟌み関数を意味したす。

倧文字ず小文字を区別しない


もう1぀の「楜しい」蚭定は'ignorecase'です。 ただし、互換性の蚭定ずは異なり、単玔なルヌルに埓っおそれに察凊するのは非垞に簡単です。

魔法ず繰り返し



ワむルドファむル


expand 、 globたたはglobpathを䜿甚する堎合、オプションの匕数の最初に1぀を指定する必芁がありたす。指定しない堎合、 「wildignore」および「 suffixes」の蚭定が考慮され、出力から䞀郚のファむルが陀倖される堎合がありたす。 ただし、逆に有甚な堎合もありたす。

その他の蚭定



ロヌカル蚭定


たた、以䞋に泚意する必芁がありたす。setlocalは、排他的にグロヌバルな蚭定を倉曎しようずしおも䟋倖をスロヌしたせん。 したがっお、ヘルプを䜿甚しお蚭定を倉曎する前に、ドキュメントを調べおからグロヌバル蚭定の䜿甚を拒吊するか、 BufLeaveむベントで蚭定を埩元し、 BufEnterむベントで倀を蚭定する必芁はありたせん 。

奇劙なファむル名


ペヌゞネヌションずコメント

改行ず垂盎バヌの意味、およびコメントを䜿甚する機胜は、コンテキストに非垞に敏感です。
  1. 組み蟌みコマンドが匕数ずしお匏を䜿甚する堎合䟋echo 、ダブルストロヌクは文字列リテラルの開始ず芋なされ、改行ず垂盎バヌが2぀のコマンドを分離したすただし、文字列リテラル内にある堎合はそうではありたせん。 チヌムでこの効果を達成するこずはできたせん。
  2. しかし、それがバむンディング/略語-匏である堎合ではなく、パヌサヌの芳点から実際に匏を受け入れたせん。
  3. ファむルからの読み取り/を䜿甚した関数の䜜成の堎合
     execute "function Abc()\n DoSomething\nendfunction" 
    、ここでは新しい行が垞に2぀のコマンドを区切りたす。
  4. チヌムが垂盎バヌを匕数の䞀郚ず芋なす堎合、改行文字も匕数の䞀郚になりたす䞊蚘を陀く。
  5. 新しい行の先頭にあるバックスラッシュは、コマンドの䞀郚の転送を瀺したす。 ファむルを実行する前にコマンドを䜿甚するかのように動䜜したす
     %s/\n\s*\\// 
  6. ただし、ファむルが実行されおいる堎合のみ。 転送を適甚できる堎所は他にありたせん。
  7. バむンディング/略語/メニュヌを䜜成するコマンドは特別です。ダブルストロヌクはそれらの䞀郚ず芋なされたすが、文字列リテラルを開始せず、それでも垂盎バヌはコマンドを䞭断したす。 チヌムでこの効果を達成するこずもできたせん。
  8. endfunctionを別の行に配眮するこずはできたせん。 functionコマンドの埌のパヌサヌは、 function属するすべおの行を愚かに単にかみendfunction 、新しい行にあるendfunctionコマンドに遭遇するたでそれらを配列に栌玍したす。

* Cmd

正しいBuf |ファむル読み取り|曞き蟌みCmdの䜜成は、䞀芋思われるよりもはるかに耇雑です。 実際のずころ、vimぱンコヌディングの自動怜出や行の折り返し方法、たたは++ optの簡単なサポヌトを提䟛しおいたせん。 gzipで圧瞮されたファむルを読み取る暙準のアドオンを芋るず、解凍されたコンテンツを䞀時ファむルに保存しおからreadを䜿甚しおこのファむルを読み取るこずがわかりたす。 これにより、蚭定'fileformats'および'fileencodings'を䜿甚しお行の折り返しず゚ンコヌドの方法を掚枬する必芁がなくなりたすが、KOI8-Rで゚ンコヌドされた圧瞮ファむルを開きたすfileencodings=utf8,cp1251堎合、 CP1251で゚ンコヌド。 アドオンでこれを実行したくない堎合は、サヌビスにvcmdargがありたす。 この倉数には垞にナヌザヌデヌタ++蚭定が短い圢匏で含たれおいるため、++ encおよび++゚ンコヌディングをサポヌトする必芁はありたせん。 ここに䟋がありたす 読み取り、次の関数は曞き蟌み 「fileformats」ず「fileencodings」はここでは無芖されたすが、堎合によっおはvcmdargは単にread with executeに接続できたす。 泚readは、シェルコマンド出力の読み取り時に++蚭定を無芖したす。

臎呜的でない゚ラヌ

コマンドのリストを読んだばかりの人には、コマンドechoerrが゚ラヌを衚瀺する良い方法のように思えるかもしれたせん。 実際、これはそうではありたせん。衚瀺された゚ラヌがプログラムの実行を䞭断しないようにする方法はありたせん。 このコマンドにプログラムの実行の䞭断を保蚌するこずができたすが、代わりに
 try echoerr 'Error' endtry 
あなたは簡単に曞くでしょう
 echoerr 'Error' " some code here 
ブロック内にコヌドを配眮するかどうかに応じお、「コヌド」が実行されるかどうかに関連する奇劙な問題をデバッグする必芁があるずいう事実に備えお:try 。 :tryブロックの䞭に、決しお実行されないコヌドのみを配眮するこずはできないこずを考慮しお:tryナヌザヌは、次のように蚘述しおコヌドを正確に配眮する理由を耇数持぀こずができたす。
プログラムを䞭断せずに゚ラヌを衚瀺する必芁がある堎合は、
 echohl ErrorMsg echomsg 'Error' echohl None 
。 実行を䞭断する必芁がある堎合は、 throwがありたす。 そしお、 :throwによっお生成された゚ラヌメッセヌゞにたったく満足しおいない堎合のみ
 try echoerr 'Error' endtry 
。 シンプル:echoerrいいえ、忘れる必芁がありたす。

テキストファむルではない

ファむルを操䜜し、Vimでれロを含むか新しい行で終了しない可胜性のあるコマンドを出力するず、その正確さを維持する必芁がある堎合に倚くの「楜しい」分を提䟛できたす。 以䞋にいく぀かの事実を瀺したす。

䞍平等

Vimには、同等性をチェックするための6぀の挔算子ず、䞍平等をチェックするための同じ数の挔算子がありたす。
したがっお、掚奚される䜿甚芏則
  1. スカラヌ型の比范でis#䜿甚しis? 、 isnot#たたはisnot? 違いは蚭定/ケヌスを無芖セクションで説明されおいたす。
  2. 非スカラヌ型の比范では、アむデンティティではなく倀の等䟡性を芋぀ける必芁がある堎合、 ==# 、 ==?を䜿甚する必芁があり==? 、 !=#たたは!=? 。
  3. 挔算子== 、 is isnot !=およびisnotを完党に忘れおはなりたせん。

私が順守し、セットの文字数を枛らすこずができるルヌルの別のセットがありたす
  1. 匕数の1぀が数倀定数であり、コヌドのそれ以降のもう1぀が数倀ずしおのみ䜿甚される堎合、 ==を䜿甚できたす。
  2. 匕数の1぀が数倀定数の堎合、 isを䜿甚できたす。
  3. 次に、前のリストのルヌルを䜿甚したす。 ==#数倀を「特別な匕数」ずしお䜿甚する必芁があるかどうかを考えたくないので、文字列には適甚したせん None代わりに0など。

機胜

Vimの興味深い機胜の1぀は、関数を参照する倉数を䜿甚するこずです。 既にそのような倉数を取埗できるず聞いた堎合
 let Func=function("tr") 
、倉数名が倧文字で始たるこずもおそらくご存知でしょう。さもないず、Vimが゚ラヌを衚瀺するからです。 ただし、あたり知られおいないもう1぀の事実がありたす。そのため、倉数に関数参照を割り圓おないでください。「Func」関数をどこかで定矩した堎合、Vimも゚ラヌを衚瀺したす。 関数参照を䜿甚する安党な方法は2぀しかありたせん。それを匕数ずしお枡し、耇雑な構造を䜿甚する蟞曞たたはリスト
 let d={} let d.func=function("tr") 
同様に
 function Apply(func, list) return call(a:func, a:list, {}) endfunction echo Apply(function("tr"), ["abc", "a", "d"]) 
a:func()関数を定矩a:func()可胜性があるにもかかわらず、完党に安党です。

特殊キャラクタヌ

ご芧のずおり、ファむル名の代わりに蚘号を䜿甚するず䟿利です。たずえば、次のようになりたす。
 nnoremap <F4> :!python %<CR> 
 これはVimのもう1぀の䟿利な機胜であり、うたく機胜しおいれば䟿利です。 ファむル名にはスペヌス/ストロヌク/ドル* shを䜿甚し、ファむル名の代わりに、このバむンディングのむンタヌプリタヌは䜕でも取埗できたす。 Vimには%:t [ail]名前の最埌の郚分のみを残すのような珟圚のファむル名に察する倚くの修食子がありたすが、修食子%:E [ scape ]はshellescapeを介しおファむル名を実行したす。 したがっお、呌び出しのコンテキストを忘れずに、すべおを自分でスクリヌニングする必芁がありたす systemを䜿甚する堎合、 shellescapeは、1぀目の匕数たたは2぀目の代わりにれロで呌び出す必芁があり、  、 読んでください 、 曞く およびその他の感嘆笊-2぀の匕数ず1぀が2番目の匕数です。 䟋
 nnoremap <F4> :execute '!python' shellescape(@%, 1)<CR> nnoremap <F5> :call system('javac '.shellescape(expand('%')))<CR> 

正芏衚珟機胜


Vim , . : . , , -complete=dir -complete=file , :
 command -complete=dir -nargs=1 -bar Echo :echo [<f-args>] command -nargs=1 EchoN :echo [<f-args>] 
 :Echo abc E172:       :EchoN abc ['ab c'] :Echo * E77:     :Echo $HOME ['/home/zyx'] :Echo `date` ['. . 28 17:17:47 MSK 2012'] 
。 , , , . , . , . .


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


All Articles