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これは使いたくない
「選択範囲の長さ」とは、「選択された文字数」で合っていますか?
そうだと仮定して質問です。
ビジュアルモードは入った時点でカーソル位置の1文字分が選択された状態になります。よって、長さが 0 と言うのはありえないかと思うのですが、長さが 0 とはどのような状態を想定していますか?
質問文を選択された文字数と読み替えていただいても間違いではないかと思います。
<a></a> でvit や "" で vi" などで選択する場合、まるで入力状態に見えるような細長い範囲を選択しています。この状態を長さ0としました。
なお、<a></a>でyit、また""でyi"だと何も取得できないので、空または選択範囲がない(長さが0)という情報はどこかにあるのではないかと考えています。
x間違いではないか
○問題ない
読み返して伝わらない書き方に思えましたので、返信文を修正します。
vit や vi" ですが、私の環境(Windows + GUI Vim 7.4.1944 / Linux + CUI Vim 7.4.2031) ではそのような表示にはなりませんでした。また、このビジュアル選択中に y を押すと、< や " がコピーされます。OS や Vim のバージョンなどの環境情報を教えて頂けるでしょうか?
vimはkaoriyaさんの gvim 7.4.1721 32bit版です。osはwindows10です。ちなみに私も<a></a>でvitで選択中にyを押すと<がコピーされます。yitならコピー内容が空になります。
回答1件
あなたの回答
tips
プレビュー