3

移動コマンドが垂直(または水平)バッファを「ラップアラウンド」するようにvimを構成することは可能ですか?

言い換えれば、ビジュアル モードでバッファの 2 行目にいるとします。を押し3kます。カーソルがバッファの最後の行に配置されました。

もっと簡単に言えば、カーソルがファイルの最初の行にあるので、 を押しkます。カーソルがファイルの最後の行に移動します。

これが以前に尋ねられた場合は申し訳ありませんが、「循環スクロール」または「ラップアラウンドスクロール」を検索する参照が見つかりませんでした。

4

2 に答える 2

5

一部の vimscript ハッカーではおそらく可能Gですが、ファイルの末尾に移動しggたり、ファイルの先頭に移動し1Gたり<C-Home>するなどの動きで効率的になる方がはるかに普遍的です。同様に$、行末と0行頭、または^最初の空白以外の文字についても同様です。

を設定することもでき:help whichwrapます。これは、行末を超えて移動するときに次の行に移動するキー、または行頭を超えて移動するときに前の行に移動するキーを指定します。それ以外は、あなたが求めている機能が組み込まれているとは思いません。いくつかのvimscriptでそれを行うことができますが、h、j、k、およびlを関数に再マッピングし、それらが行/ファイルの最後/最初にあるかどうかを処理する必要があります. 私には、それはやり過ぎでかなり面倒に思えます。

そうは言っても、もしあなたがしなければならないなら...

nnoremap j :call CheckJ()<cr>
nnoremap k :call CheckK()<cr>
nnoremap h :call CheckH()<cr>
nnoremap l :call CheckL()<cr>

fun! CheckJ()
   if line('.') == line('$')
      norm! gg
   else
      norm! j
   endif
endfun

fun! CheckK()
   if line('.') == 1
      norm! G
   else
      norm! k
   endif
endfun

fun! CheckH()
   if col('.') == 1
      norm! $
   else
      norm! h
   endif
endfun

fun! CheckL()
   if col('.') == (col('$') - 1)
      norm! 0
   else
      norm! l
   endif
endfun
于 2012-09-12T04:06:28.180 に答える
4

Vimはテキストエディタであり、テキストには、列と行の両方に開始と終了があるという物理的および論理的なプロパティがあります。したがって、あなたが要求している機能は存在せず、おそらくVimに含まれることはないでしょう。

ただし、ほとんどの移動コマンドをカスタム実装にバインドすることにより、Vimscriptでエミュレートすることができます。:42,10ただし、範囲(たとえば)がまだラップアラウンドしないため、使用モデルに不整合が生じます。

なぜそのようなラップアラウンドが必要なのですか?これは特定のファイルタイプ用ですか、それとも別のエディターから慣れていますか?

于 2012-09-12T05:18:27.637 に答える