タグ付けされた質問 「vimscript」

Vimに埋め込まれたスクリプト言語。これを使用して、Vimをニーズに合わせてカスタマイズしたり、プラグインを作成したりできます。VimLとも呼ばれます。

1
rcファイルにカスタムの「設定」コマンドを作成して、モードラインから呼び出すことはできますか?
私が最近質問したところ、:set vimモードラインではパラメーター以外のものを渡すことはできないことがわかりました。セキュリティの問題は理解していますが、これを回避する方法がないのではないかと思います。SOに関する最近の質問符号化規格に準拠するためのパラメータの大きなバッチの設定については、考えて、考え、モードラインからオンまたはオフにすることができ、私のrcファイルで物事の「グループ」を定義することが可能であることが私を得ましたか? 疑似コードはありませんが、設定されたパラメーターからトリガーされる関数を作成する方法はありますか? set_function! codestyle() if &1 == 'psr-2' set ts=4 set sw=4 endfi if &1 == 'drupal7' set ts=2 set sw=2 iab D8 Drupal 8 endif endset_function これは、次のようなモードラインによってトリガーされます。 # vim: codestyle=psr-2 これは、いくつかの点でファイルタイプマッチングに似ていますが、手動オーバーライドを許可します。また、他の事前定義された方法で環境をセットアップし、vimでファイルが他の任意のコマンドを実行するというセキュリティの問題を回避しながら、よりカスタマイズされた環境を可能にします。これを行う方法はありますか?


2
Vimスクリプトでスペースを含む文字列を処理する方法は?
vimrcに次のコマンドがあります。 execute "set path+=".getcwd()."/**" 現在の作業ディレクトリがのようであれば、うまく機能します/home/tamlok/my_work/。ただし、ディレクトリになどのスペースが含まれている場合D:\Program Files\vim\、vimは文句を言うでしょう。 substitute()関数を使用してこれを修正し、すべてのスペースをエスケープされたスペースに置き換えることができると思います。経験豊富なビマーはここで何をしますか? もう1つの問題は\Windowsにあります。場合getcwd()を取得D:\Program Files\vim\、私はエスケープする必要がありますか\と\\かと交換してください/? 今のところ私はそれをこのように扱います: let mycwd=substitute(getcwd(), '\\', '/', 'g') let mycwd=substitute(mycwd, ' ', '\\ ', 'g') execute "set path+=".mycwd."/**" それは大丈夫ですか?どんな助けでもありがたいです!どうもありがとう!


1
Vimディスプレイをテキストに出力
に似たコマンドはあるのでしょうか:TOhtml。ただし、プレーンテキストのみで、Vimディスプレイ全体を表します。 たとえば、次の表示があるとします。 次のテキストファイルを作成します。 1 B 1 a ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ N <me] [+] 100% 1:1 ~ 1 a ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ N <me] [+] 100% 1:1 N <e] [+] …
9 vimscript 

1
入力を取得中に更新される演算子を定義するにはどうすればよいですか?
テキストの領域を取り、入力文字列を要求し、入力文字列を引数として使用して領域を表形式に揃える演算子マッピングを定義しました。それはうまくいきます。 私は、vim-operator-userを使用して新しい演算子を定義するのに役立つように、次のように実装しました。 map \aa <Plug>(operator-align) call operator#user#define('align', 'Align') function! Align(motion_wiseness) let expr = input("align: ") if len(expr) != 0 execute "'[,']Tabularize /".expr endif endfunction function! Getchar() let c = getchar() if c =~ '^\d\+$' let c = nr2char(c) endif return c endfunction 次に、整列する正規表現を入力しながら、その場で更新できるかどうか疑問に思いました。現在のアプローチの問題は、正しい式を使用していない場合、元に戻してからやり直す必要があることです。 インタラクティブな試みのために、私はこれを行いました: map \== <Plug>(operator-align-interactive) call operator#user#define('align-interactive', 'AlignInteractive') …
9 vimscript 

1
数行の指示
1行の命令を複数の行に分割する方法はありますか? たとえば、変身したい setlocal variable_name = condition1 ? "1" : condition2 ? "0" : condition3 ? "a long string" : "another long string" に setlocal variable_name = condition1 ? "1" : condition2 ? "0" : condition3 ? "a long string" : "another long string" しかし、上記のようにしようとすると、「無効な引数」エラーが発生します。
9 vimscript 

1
試合内でより短い試合を好む正規表現?(これは貪欲でないよりも複雑です)
バッファ内であいまい検索を実行するためのスクリプトを作成しようとしています。主なアイデアは、何らかの入力を取り.\{-}、すべての文字のペアの間に挿入することです。たとえば、にfooなりf.\{-}o.\{-}oます。 これはかなりうまく機能しますが、理想的ではない多くの一致が生じます。あいまい検索では、最短の一致が最初に得られると思います。次の例について考えてみます。 public void put() put(so、p.\{-}u.\{-}t)のあいまい検索を実行すると、文字列全体に一致しますpublic void putが、putその一致内で短い方が便利です。 貪欲でない演算子は、早く終了する一致を見つけるのに適していますが、同時に開始する一致を優先できるものが必要です。概念的には、両方向で貪欲ではないはずです。これは可能ですか?

1
=〜演算子の使用法
VimScriptの正規表現比較演算子について少し混乱しています。 :h =~?私の理解をよく見ると、=~これは正規表現一致を行うために使用できます(?大文字と小文字を区別しないようにすることで)。 しかし、このコードは "no"を出力します: let s:myVar = "S123" if s:myVar =~? "^S\d+" echo "yes" else echo "no" endif =~演算子を間違って使用していますか?

2
Vimscript:自動読み込み、スコープ、<SID>のヘルプ
私は自分のコードをモジュール化してvimrc、いくつかの自己完結型で再利用可能なバンドル/プラグインプラグインに変換する作業を行っています。理解できないオートロードとスコープの問題に遭遇しました。私はを読みました:h autoload、:h &lt;sid&gt;、:h script-local、私はどのようにこの作品にはまだ非常に明確ではありませんよ。 私はいくつかのよく開発されたプラグインを調べて、一般的に使用されるパターンを理解し、プラグインを次のように構成しました。 " ~/.vim/autoload/myplugin.vim if exists('g:loaded_myplugin') finish endif let g:loaded_myplugin = 1 let g:myplugin_version = 0.0.1 " Save cpoptions. let s:cpo_save = &amp;cpo set cpo&amp;vim function! myplugin#init() " {{{ " Default 'init' function. This will run the others with default values, " but the intent is that …
9 vimscript 

1
関数内のvimL睡眠
私は、十字カーソルを100ミリ秒間置いてカーソルの位置を簡単に確認できる関数を定義しようとしています。 これが私の試みです: function! Flash() set cursorline cursorcolumn sleep 100m set nocursorline nocursorcolumn endfunction nnoremap &lt;leader&gt;fl :call Flash() ただし、上記の関数は2つの「セット」呼び出しの間ではなく、最初にスリープを呼び出しているようです。 私が誤解している「睡眠」についての基本的なものはありますか?
9 vimscript 

1
特定の名前または拡張子を持つ「古いファイル」を検索できますか?
oldfilesとbrowse oldfilesコマンドをいつも使用しています。私のリーダーマッピングにアクセスし、ファイルをすばやくスキャンして、 q&lt;number&gt;&lt;enter&gt; 特定のファイルへの非常に長いディレクトリパスを入力するのではなく、(特に時々、それがどのディレクトリにあるのか覚えていないことがあります) ただし、欠点は1つだけです。私はvimを頻繁に使用しているため、探しているファイルが数十および数十行下にある場合があるため、検索に非常に長い時間がかかります。oldfiles特定の拡張子のみを表示するためにによって与えられたファイルのリストをフィルタリングできる方法はありますか? たとえば、次のようなコマンド: browse oldfiles *.py これは、.py最近開いたファイルのリストを表示し、番号の入力を求めてから、そのファイルを開きます。 これを行う方法がない場合、同様の機能を持つプラグインはありますか?

1
定義された列の後のコメントに色を付ける方法
私はかつて、このヘルパーがvim列80の行の長さ制限にPEP8ルールを適用するのを助けるために縦線の種類を表示できるようにするためにこれらの資料を与えられました。 " Long lines highlighting. nnoremap &lt;Leader&gt;H :call&lt;SID&gt;LongLineHLToggle()&lt;cr&gt; hi OverLength ctermbg=none cterm=none match OverLength /\%&gt;80v/ fun! s:LongLineHLToggle() if !&amp;diff if !exists('w:longlinehl') let w:longlinehl = matchadd('ErrorMsg', '.\%&gt;80v', 0) echo "Long lines highlighted" else call matchdelete(w:longlinehl) unl w:longlinehl echo "Long lines unhighlighted" endif endif endfunction 実行中: これらすべてを使用して、80番目の列をマークします。 十分な時間と労力が与えられれば、コメントの場合にのみ、vim 72桁目をはるかに超えるテキストをマークするための同様の機能を利用できます。誰かがどこかの時点ですでにコード化していると思います。そのスニペットの場所をすでに知っていますか?

2
不明な `_vimrc`または` vimscript`ファイルを使用するのはどのくらい安全ですか?
この質問をここで行うべきかどうかはわかりません。ほとんどすべての言語で、マルウェアが存在します。同じことが当てはまりvimscriptますか? 仮定しvim、高いシステム権限で実行されています。新しいvimユーザーがプラグインまたは見栄えのするvimrcファイル(つまり、他のスクリプト言語でのいわゆる悪意のあるスクリプト)を使用してシステムを破壊する可能性はありますか? 未知のスクリプトファイルを実行する前に、新しいユーザーが対処できる方法は何ですか?スクリプトを無効にすることは、そのための明白な解決策であることを知っています。しかし、新しい学習者にとっても非常に便利なプラグインの数は非常に多くあります。 繰り返しになりますが、この質問はここには当てはまらないかもしれませんが、セキュリティも全体像の非常に重要な部分だと思います。 これに関するいくつかのリソースまたは情報をvim指すと、私のような新しいユーザーにとって非常に役立ちます。

1
構文ファイルから重要なキーワードをエスケープする方法は?
私は構文ファイルでこの行に出くわしました。それは機能しません: syntax keyword Type Transparent これはtransparent、Vimにとって重要なキーワードであるという事実と関連があると思います。 それをエスケープし、実際の単語をTransparent他のすべてのType単語と同じようにファイルに色付けするにはどうすればよいですか?私のような他の厄介なキーワードaccross 1日つまずく場合はどうkeyword、syn、matchなど?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.