質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

1回答

2049閲覧

ビジュアルモードでの長さの取得

oskbt

総合スコア1895

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

1グッド

0クリップ

投稿2016/07/14 10:13

編集2016/07/14 16:48

vimscriptでビジュアルモードの選択範囲を取得して、その長さにより処理を変えたいのですが、長さが0のときと1のときの違いをうまく取れなくて悩んでいます。


追記
<a>b</a> でvitのときの状態を長さ1 bが選択されている
<a></a>で vitのときの状態を長さ0 選択範囲は空(ない?)
としました

追記2
vimはkaoriyaさんの gvim 7.4.1721 32bit版です。


vimscript

1function hoge() 2let [l:lnum1, l:col1] = getpos("v")[1:2] 3let [l:lnum2, l:col2] = getpos(".")[1:2] 4 5if l:lnum1 == l:lnum2 && l:col1 == l:col2 6"選択範囲が0か1のとき 7endif 8endfunction 9 10vmap <expr> <plug>(hoge) hoge()

これで選択範囲の長さが1より大きいときの場合とは分離できているのですが、こんな感じのやり方では0と1で違いがないようです。
選択範囲の最後のところにカーソルがあるので、getpos(".")でカーソルの位置を取得しているのですが、そのカーソルの頭の方の値を返すため、厚みのない0のときと1のときで同じ値を返しているのかと考えています。

カーソルの後ろの方の値の取り方や、そもそもビジュアルモードの選択範囲の長さの取り方など知っていたら教えてほしいです。

ちなみにcommandに渡すやり方は以前とっていたのですが、マクロを利用するときバグるのでやめました。

vimscript

1let [l:lnum1, l:col1] = getpos("'<")[1:2] 2let [l:lnum2, l:col2] = getpos("'>")[1:2] 3これは使いたくない
thinca👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thinca

2016/07/14 11:23

「選択範囲の長さ」とは、「選択された文字数」で合っていますか? そうだと仮定して質問です。 ビジュアルモードは入った時点でカーソル位置の1文字分が選択された状態になります。よって、長さが 0 と言うのはありえないかと思うのですが、長さが 0 とはどのような状態を想定していますか?
oskbt

2016/07/14 11:44

質問文を選択された文字数と読み替えていただいても間違いではないかと思います。 <a></a> でvit や "" で vi" などで選択する場合、まるで入力状態に見えるような細長い範囲を選択しています。この状態を長さ0としました。 なお、<a></a>でyit、また""でyi"だと何も取得できないので、空または選択範囲がない(長さが0)という情報はどこかにあるのではないかと考えています。
oskbt

2016/07/14 11:47

x間違いではないか ○問題ない 読み返して伝わらない書き方に思えましたので、返信文を修正します。
thinca

2016/07/14 14:53

vit や vi" ですが、私の環境(Windows + GUI Vim 7.4.1944 / Linux + CUI Vim 7.4.2031) ではそのような表示にはなりませんでした。また、このビジュアル選択中に y を押すと、< や " がコピーされます。OS や Vim のバージョンなどの環境情報を教えて頂けるでしょうか?
oskbt

2016/07/14 16:46

vimはkaoriyaさんの gvim 7.4.1721 32bit版です。osはwindows10です。ちなみに私も<a></a>でvitで選択中にyを押すと<がコピーされます。yitならコピー内容が空になります。
guest

回答1

0

ベストアンサー

ビジュアルモードにおいて、長さ0はありません。必ず1文字以上の範囲が選択されます。
<a></a> での yit の結果が空なのは、終点より始点が後であるような範囲が指定されるためです。

vim

1function! InspectOperator(wise) abort 2 echomsg string([getpos("'["), getpos("']")]) 3endfunction 4 5set operatorfunc=InspectOperator
<a></a>

上のスクリプトを実行し、下のテキスト上で g@it とすると、以下の結果が得られます。

[[0, 1, 4, 0], [0, 1, 3, 0]]

始点が 4 桁目、終点が 3 桁目になり、対象範囲は空になります。ビジュアルモードではこのような選択はできません。

投稿2016/07/15 01:55

thinca

総合スコア1864

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oskbt

2016/07/15 03:21

ご回答ありがとうございました。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問