2016-10-06 5 views
0

vimが単語として認識すべきものを定義する方法はありますか? 正規表現をVimの "w"、 "e"、 "b"キーに設定する方法は?

nnoremap <silent> w :call search('\w\+')<CR> 

が、それはしていません:私は、私はこのようなノーマルモードのためにそれを行うことができます...すべての単語のキーな「W」のように動き、「E」、「B」に\ W +正規表現を割り当てますビジュアルモードとオペレータペンディングモードで動作します。これを行うための設定があれば素晴らしいことでしょう。 E Wと 、「単語」の定義は:iskeywordオプションによって制御されているような小文字の動作について

答えて

1

私はあなたの質問から理解し、Kazの答えについての議論から、あなたが探しているものは、かなのスマートワード・プラグイン:http://www.vim.org/scripts/script.php?script_id=2470だと思います。

あなたは:help smartwordとマニュアルを確認する必要があるとしているが、ショートバージョンが、プラグインをインストールし、プラグインのものに内蔵された単語のマッピングをマップする場合、ある...

map w <Plug>(smartword-w) 
map b <Plug>(smartword-b) 
map e <Plug>(smartword-e) 
map ge <Plug>(smartword-ge) 

...組み込み関数は途中で単語以外の文字をスキップします。私はこれを長年にわたって使ってきましたが、その動作にはとても満足しています。

+0

これはまさに私が探していたものです。ノーマル、ビジュアル、およびオペレータペンディングモードは正常に動作します。ありがとう。 – Evgeniy

1

。その上の:help iskeywordを参照してください。基本的には、個々の文字または範囲としてカンマで区切って指定された文字のリストで構成されます。私はさまざまな構文ファイルが異なる言語のためにこれを微調整するので、これらのコマンドは識別子によって動くと思います。このために正規表現を指定できるようには見えません。

彼らは再プログラムすることができるようにWEのような大文字の動きは見ていません。それらの "WORD"の定義は、空白で区切られた空白でない文字であり、空の各行は "WORD"としてカウントされます。

しかし、残念ながら、iskeyword文字は、入力をiskeyword文字のシーケンス、つまりiskeyword文字と空白で区切って入力するだけの動作があるようです。 wとそれに関連するコマンドを使用すると、空白はスキップされますが、iskeywordトークンとiskeywordトークンの両方にアクセスします。

:map w /\<\w/^M 
:map b ?\</\w^M 
:map e /\w\>^M 

/?検索は両方のモードで動作するので、それは両方で動作します:ちょうど/または?キーストロークシーケンスは、両方のビジュアルと、コマンドモードで動作する:mapを使用して再マッピング

。もちろん、それは現在の検索パターンを奪い、:set hlshighlightsearch)がオンの場合、単語のハイライト/テールが強調表示されるため、醜い解決策です。

上記の検索は、アンカー演算子の動作の仕方によってはあまり満足できるものではありません。たとえば、{abc(abcのようなものでaに「着陸」させることはできません。

以下のマッピングがうまく機能します。それぞれがいくつかの検索をトリガーします。 /.?.の検索は、次のまたは前の文字の に行くためのトリックとして使用されます。つまり、行の最後の文字の場合は、次の行の最初の文字に移動し、その逆の場合も同様です。

:map b ?\w^M?\W^M/.^M 
:map w /\W^M/\w^M 
:map e /\w^M/\W^M?.^M 

まだいくつかの癖があります。例えば、のような単語のリスト:

abc 
def 
ghi 

は非単語クラス\Wのための一致が含まれていません。マッチングには行末が含まれている必要があります。今後、この点でワットの改善は、次のように終わる行に一致するものを追加することです:

:map w /\(\W\\|$\)^M/\w^M 

は、パイプの前に二重のバックスラッシュを注意してください!一番右のバックスラッシュはパイプをエスケープし、:mapコマンドの処理ではそれをコマンドデリミタとして処理しません。次に、分岐の正規表現演算子である\|が残っています。同様の状況で、他の2つのマッピングを改善することができます。私はそれを運動として残しています。

+0

このオプションを「48-57,65-90,97-122、_」に変更しましたが、何も起こりません。多分私は私の質問では不正確でした。 "$"、 "="、 ">"などの記号をすべてスキップしたいと思います。 'au BufEnter * setlocal iskeyword = 48-57,65-90,97-122、_' – Evgeniy

+0

残念ながら、Vimは空白以外の文字としてセットの文字*を扱います。だから、もし 'iskeyword'を小文字のazと定義し、' abc $ def'の 'a'にカーソルを置くと、' w'は '$'を、次に 'def '。基本的に、テキストは非単語で区切られた単語にトークン化されますが、その後に両方が訪れます。 – Kaz

+0

カスタム検索を行うためにキーを再バインドしているように見えるのはおそらく唯一の方法です。たとえば、 ':map w/\ <\ w^M'('^M'はCtrl-V Enterと入力します)。残念ながら、これは現在の検索パターンを破壊します。 – Kaz

関連する問題