空白以外の文字に到達するまで垂直に移動するにはどうすればよいですか?


27

(正確に)インデントされたコードを持つ非常に長いファイルでは、インデントを区切るカーソルの上下のテキスト行に直接移動すると役立つ場合があります。

(これを行う1つの方法は、インデントfoldメソッドを使用することです。現在のインデントレベルを折り畳むことにより、インデントレベルを区切る行をカーソルからjまたはそれ以外にk折り畳みます。興味のあるインデントで作業することができました。)

下の例では、カーソルがアンダースコア_(との定義の間の2番目の文字列)でマークされていますが、s 内の段落または行の数が不明または可変であるclass Bazzclass Qux想像してくださいmodule

module Foo
  # lots of code...
end

module Bar
  class Baz
    # ...
  end

  class Bazz
    # lots of code...
  end
 _
  class Qux
    # ...
  end

  class Quux
    # lots of code...
  end
end

... カーソルomodule Bar上の行、または最後の行のカーソルnend下の行にすばやく移動するにはどうすればよいですか?垂直列には空白が含まれていますが、class定義間の2番目の列には文字が含まれていないことに注意してください。



gを押してから方向キーを押すと、タブが表示されずに行を移動できる場合があります
-SibiCoder

1
@alxndrのリンクの解決策は、空白のメンテナンスが不十分な場合(たとえば、空白のみのランダムな行がある)を除いて、うまく機能し、空白を無視する必要があります。以下のsuperjerのソリューションは、そのケースを懸念している場合に適しています。
-nukeguy

回答:


9

この機能はどうですか?

function FloatUp()
    while line(".") > 1
                \ && (strlen(getline(".")) < col(".")
                \ || getline(".")[col(".") - 1] =~ '\s')
        norm k
    endwhile
endfunction

nnoremap gU :call FloatUp()<CR>gU「上へ」)、そしてで呼び出すことができgUます。

説明は次のとおりです。

  • 条件が満たさnorm kれる限り、コードはカーソルを(上に)繰り返し移動しますwhile
  • whileこれは、最初の行(いない場合は条件が成立するline(".") > 1のいずれか)とは、
    • この行は短すぎます(おそらく空です)。または
    • 現在の列(getline("."))の現在の行()の文字[col(".") - 1]は空白です(=~ '\s';つまり、空白パターンに一致します)。

1
これは完全に(そして迅速に)動作するFloatDownようで、同様に関数に簡単に変更できます。私の.vimrcには、感謝します!github.com/alxndr/dotfiles/commit/0e25a302
alxndr

1
このソリューションは、ビジュアルモードではまったく機能しないことを発見しました(どのビジュアルモードによっても動作が若干異なり、同じ位置に留まるか、1行だけ移動します)。そこに何が起こっているのかについてのポインタはありますか?
alxndr

13

Vimの正規表現には、この場合の特定の仮想列番号など、非常に多くの検索可能なものがあるため、これらの検索を使用するのが好きです。

nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>

nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>

cd下に行くと上cuに行くために使用します。ここで「列を上に」と「列を下に」と考えています。これらはデフォルトではノーオペレーションであることをほぼ100%確信しています。または、独自のマッピングを選択します。

これは、タブまたはスペース、あるいはその両方を使用している場合に機能するはずです。


1
これらのコマンドの解析に問題があります。それらを少し拡張していただけますか?
-davidlowryduda

1
/または?下または上に検索するには、\%xvは仮想列番号 'x'に検索を制限します。この場合の 'x'はvirtcolコマンドを実行して挿入する '<CR> = virtcol( "。")<CR>'です。カーソルが式にある仮想列番号。\ Sは空白以外の文字を意味します。
チャド

1
チャドを説明してくれてありがとう。挿入モードまたはコマンドラインモードで<CR>を追加して、レジスタの内容を取得します。=レジスタは、所定の位置に式を評価表現のレジスタです。少し奇妙に見えても、非常に便利です。
-superjer

1
このアプローチの欠点の1つは、検索の強調表示をオンにしている場合、カーソルの垂直列のすべての文字が「列を上げる」または「列を下げる」後に強調表示されることです。
-alxndr

3
既存の検索を保護する場合は、先頭:let searchbak=@/<CR>に追加して追加できます:let @/=searchbak<CR>。しかし、この時点で、それは一種の長くて近づきにくいものになっており、おそらく単なる機能であるべきです。
-superjer

7

JumpToVerticalOccurrenceプラグインを使用できます(デフォルトは]|およびにマップされます[|)。のよう]V{char}に機能するがf、垂直に機能する他の機能はほとんどありません。もちろん、必要に応じてそれらを再マッピングできます。


プラグインを使用したくない場合:searchvirtcol(.)、で使用してみてください。例:

:call search('\%' . virtcol('.') . 'v\S', 'bW')

ここで:

  • virtcol('.') 現在の列を提供します
  • \S 非空白の略
  • bW 後方検索用

詳細:help searchを確認してください。

使いやすくするために、次のようにマップできます。

:map <C-k> :call search('\%' . virtcol('.') . 'v\S', 'bW')<CR>
:map <C-j> :call search('\%' . virtcol('.') . 'v\S', 'W')<CR>

あなたのコードは、角かっこが含まれている場合は別の方法として、使用することは、%(例えば、それらをマッチングの間でジャンプし{}[]、など)、または段落全体が(ジャンプ使う{}Shift必要に応じて)。


リンク/ソース:


から:h search()w手段wrap around the end of the fileW手段don't wrap around the end of the file。しかし、なぜ2番目にそれらをまとめたの:mapですか?
JairLópez16年

@JairLopez正しい、wそこにあるべきではないので、私はそれを削除しました、ありがとう。モーションキーの意味に戸惑っていたのでしょう。
ケノーブ


2

それは垂直移動ではないため、あなたが求めたものとは正確に異なりますが、似ており、高速で、2段落後ろに移動するのに十分かもしれません:{{。これにより、直前の行に移動しmodule Barます。


2
カーソルとその最上位module行の間に不明な数の行や段落があると想像してください。(具体的には、このような状況は、私は最近、正確なインデントが、空行で、数千行の長サードパーティのコードをナビゲートし、モジュールの定義の外側のコンテキストを検索しようとした際に生じたものである。)
alxndr

段落単位でジャンプすることは、私の好みの移動方法ですが、オプションではありませんでした。ファイル全体が1つの「段落」でした。
alxndr


1

そのために、独自のプラグインmove_until_char_changes.vimを使用します。

私はそれをマッピングgKしてgJ

現在の列(空白だけでなく)に同じ文字が含まれる多くの行をジャンプします。これは、繰り返し文字列を含むログファイルまたはSQLダンプで役立ちます。

デフォルトでは、「検索」文字をピックアップする前に、最初に1行移動します。

2回使用しようとしない限り、ビジュアルモードで動作し、ラインまたはブロックごとのビジュアルモードではありません...(修正は大歓迎です!)


1

私はそれを答えとしてここに見ないので(編集者は、superjerが非常によく似たものに言及していることに気付いただけです)。/または?サーチ。

たとえば、次のように2列目の空白以外の文字を下方向に検索できます。

/\%2v\S

内訳は次のとおりです。

/    "search downward (use ? for upward movement)
\%2v "for the following char in the 2nd virtual column
\S   "any non white space character

その後、通常の演算子を使用して検索を繰り返すことができます。

この件に関する詳細は、:help \%cおよびをご覧ください:help \%v

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