facebook twitter hatena line google mixi email
★お気に入り追加


■ このスレッドは過去ログ倉庫に格納されています

  • 1
  •  
  • 2015/01/13(火) 13:05:45.21
主にWindows環境でのVimについてのスレッドです。

本家: http://www.vim.org/
Windows版バイナリ配布: http://www.kaoriya.net/
vim-jp: http://vim-jp.org/
VimWiki: http://vimwiki.net/
ctags 日本語対応版: http://hp.vector.co.jp/authors/VA025040/

名無しのVIM使い(スクリプト) http://nanasi.jp
spanish passion Linux(全オプション) http://www15.ocn.ne.jp/~tusr/
ずんWiki http://www.kawaz.jp/pukiwiki/?vim

関連リンク
UNIX板 Vim Part22: http://peace.2ch.net/test/read.cgi/unix/1365071542/
MacVim 再び: http://anago.2ch.net/test/read.cgi/mac/1133534694/
前スレ vim Part 5: http://anago.2ch.net/test/read.cgi/software/1379912425/

ここまで見た
  • 604
  •  
  • 2017/10/13(金) 22:17:18.33
指定した範囲内の特定の文字列を置換したい。
ただし、置換先の文字列は1から順に増加する数字を含むとする。

例えば下記のものを

abcdef
xyzcwv
ocpqr
hijkclcno
xxcx

2行目から4行目までの c を上から順に、また左から順に [1] [2] [3] [4] に置換すると、

abcdef
xyz[1]wv
o[2]pqr
hijk[3]l[4]no
xxcx

となる。

どうすれば良い?

ここまで見た
  • 605
  •  
  • 2017/10/13(金) 22:23:38.98
「ただし、」はどこにかかってるの?

ここまで見た
  • 606
  •  
  • 2017/10/13(金) 23:24:02.57
>>604
コマンド一発でやる方法は思いつかなかったわ
関数作るならもちろんできる

function! AAA() range
let i = a:firstline
let n = 1
for l in getline(i, a:lastline)
let line = l
while match(line, 'c') + 1
if match(line, 'c')
let line = substitute(line, 'c', printf('[%d]', n), '')
let n += 1
endif
endwhile
cal setline(i, line)
let i += 1
endfor
endfunction

ここまで見た
  • 607
  •  
  • 2017/10/14(土) 05:23:42.42
:let i=1 | 2,4g/./s/c/\=("[".i."]")/g | let i+=1

上のだと4行目のcは同じ数字にしか置換されない
↓これで

let g:c=0
function! Inc()
let g:c+=1
return g:c
endfunction
:let g:c=0 | 2,4g/^/s/c/\=("[".Inc()."]")/g

:global コマンドを使い慣れてないので2,4g/^/s/cのとこはキレイでないかもしれない

ここまで見た
  • 608
  •  
  • 2017/10/14(土) 21:37:36.91
>>606
>>607
今まで関数は必要なかったんで避けてきたんたが、とうとう使うときが来たか。
使い方の基礎から勉強してみるよ。
ありがと。

ここまで見た
  • 609
  •  
  • 2017/10/14(土) 22:24:49.10
関数を作ると別ファイルに分けたくなる→プラグイン開発の道へ

ここまで見た
  • 610
  •  
  • 2017/10/15(日) 11:40:20.45
連続した2行の中のそれぞれのある列からある列までの文字列を上下入れ替えたいんだけど、
素早くやる方法ってある?

たとえば、こんなの (便宜的に半角空白2文字を倍角空白1文字に置き換えた)

bindsym up  command1
bindsym down command2

こんな2行の文字列内の「up 」と「down」を入れ替えたい。
もちろん up の後ろの2つの空白文字も含めて。
こんな感じに。

bindsym down command1
bindsym up  command2

プログラミングとかコンフィグファイルとか書いてると時々あって、
今まで普通に消してから書き直すか、片方を一度別の文字列に置換する方法でスワップしてたんだけど、
これが結構疲れるんだ。
長い文字列だと、作業中に何をやろうとしていたのか、どこまでやってたのか忘れることもあるし。

なんか良い方法ない?
キーストロークでやる方法、コマンドを駆使する方法、何でもいいんだけど。

ここまで見た
  • 611
  •  
  • 2017/10/15(日) 14:06:22.54
>>610
自分は true/false を入れ替えるのにこれ使ってるわ
sagarrakshe/toggle-bool

自分はこれで足りてるけど、こっちのが高機能で色々カスタマイズできるみたい
AndrewRadev/switch.vim

ここまで見た
  • 612
  •  
  • 2017/10/15(日) 21:11:15.02
>>611
ごめん、例が誤解させちゃったみたい。

up と down だったのは特に考えなしに挙げた例で、
実際は何か意味的に対になる単語という訳じゃないんだ。
だから、予め辞書みたいに登録しておけない。

純粋に、2つの行の、同じ列から同じ列までの範囲の文字列を入れ換えたい。

矩形選択した範囲内の一番上の行と一番下の行をスワップする。
これができれば理想的なんだけど。

ここまで見た
  • 613
  •  
  • 2017/10/15(日) 22:25:14.16
>>612
俺の知識の範囲ではコマンド一発じゃ無理だけど関数作ればできるよ
置き換える範囲は正規表現でも列でもできるし

ここまで見た
  • 614
  •  
  • 2017/10/16(月) 14:09:16.56
>>613
やっぱ既存のコマンドを繋げるだけじゃ無理か。
関数作ってみるよ。
ありがと。

ここまで見た
  • 615
  •  
  • 2017/10/16(月) 15:36:02.02
>>610
洗練されてないコードだがこんなんとか
function! Sw()
let pat = '\s\+\S\+\s\+'
let l = getline('.')
let m = matchstr(l, pat)
let l2 = getline(line('.') + 1)
let m2 = matchstr(l2, pat)
cal setline(line('.'), substitute(l, pat, m2, ''))
cal setline(line('.') + 1, substitute(l2, pat, m, ''))
endfunction

ここまで見た
  • 616
  •  
  • 2017/10/20(金) 00:35:41.26
>>610
矩形選択した2行の同列の文字列同士を交換するならこんなんでどうか

function! s:SwapLine()
let pos1=getpos("'<")
let pos2=getpos("'>")
let l1=pos1[1]
let c_start=pos1[2]
let l2=pos2[1]
let c_end=pos2[2]
let len=c_end - c_start + 1
let text1=strpart(getline(l1),c_start-1,len)
let text2=strpart(getline(l2),c_start-1,len)
let line1=getline(l1)
let line2=getline(l2)

let newline1=strpart(line1,0,c_start-1).text2.strpart(line1,c_end)
let newline2=strpart(line2,0,c_start-1).text1.strpart(line2,c_end)

call setline(l1,newline1)
call setline(l2,newline2)
endfunction

vmap <C-S> :<C-U>call s:SwapLine()<CR>

ここまで見た
  • 617
  •  
  • 2017/10/20(金) 14:23:23.01
>>616
vmap <C-S> :<C-U>call s:SwapLine()<CR>

vmap <C-S> :<C-U>call <SID>SwapLine()<CR>

ここまで見た
  • 618
  •  
  • 2017/10/24(火) 12:52:35.00
ファイルの最後尾を見たくてvim(gvim)をリードモードで開きたいです。
開いたあとにshift+gや、.vimrcの設定ではなく、起動時のオプションで、リードモード、最後尾を表示、で開くにはどうしたら良いでしょうか?

ソフトの実行ログで、最後尾周辺に見たい情報があります。

ここまで見た
  • 619
  •  
  • 2017/10/24(火) 13:47:10.36
>>618
view + <ファイル名>
view にパスが通ってなかったら vim -R

ここまで見た
  • 620
  •  
  • 2017/10/24(火) 21:40:55.66
ノーマルモードで、

viWU

の後に、カーソルを最初に v を入力する時にいた位置に戻したいのたが、
関数やプラグインを使わずキーストロークのみで実現するには
マーク機能を使うしかないかな?

<c-o> を入力したら変なところ飛んじゃった。
viWU はジャンプリストには登録されないみたい。

ここまで見た
  • 621
  •  
  • 2017/10/25(水) 10:33:41.05
>>620
語頭じゃないところで単語を大文字変換して、カーソル位置が動くからそれを元に戻したい、で良いですかね。
maviWUとやって'aしてみましたが駄目でしたよ。

ここまで見た
  • 622
  •  
  • 2017/10/25(水) 18:19:16.67
>620
viWU``
こういうことをしたい感じ?
マーク機能を使っているけど自動でマークされた場所に戻るだけだからセーフということで

ここまで見た
  • 623
  •  
  • 2017/10/25(水) 20:57:59.51
二人ともありがと。

>>621
> 語頭じゃないところで単語を大文字変換して、カーソル位置が動くからそれを元に戻したい、で良いですかね。

そう。

何でだろうな、俺の環境だと >>621 は意図通り成功して、
むしろ >>622 が機能しないんだが。
ただし、>>261 はシングルクォートを使ってるから
バッククォートに変えたけどね。

できればマークを上書きしたくなかったんだが、
それしかキーストロークで実現できなきゃ潔く諦めるよ。

ここまで見た
  • 624
  •  
  • 2017/10/25(水) 22:59:13.87
あっ、再試験してみたらやっぱり手動でマークしないとダメだった……。なんだろ、無意識にm`しちゃってたのか?
改めて、 m`viWU`` ならたぶん意図通りになるんじゃないかなと。m`はジャンプリストを更新しているので最後の``はC-oでもいけるよ
:h jumplistにも載ってるからたぶん由緒正しい方法

ここまで見た
  • 625
  •  
  • 2017/10/26(木) 21:15:31.52
>>624
意図通りになった。

が、ヘルプを読んでも previous context mark の意味がよく分からん。
普通のマーク (m[a-z] m[A-Z]) とは違うの?

ここまで見た
  • 626
  •  
  • 2017/10/27(金) 18:07:57.94
日本語ヘルプだと「直前位置マーク」ってなっていて、これはとてもいい名付け方だと思う
/とかggとかGとかでカーソルがどこかへジャンプする時にジャンプ前の位置が自動でマークされる
m`は手動でそのマークを更新しているわけね

maとかして`aと違うのはカーソルジャンプが発生すると自動で上書きされるマークだから、一時的に使うだけなら後腐れがないというのが1点
それとC-oで戻れないって>620にあったので戻れるようにできないか調べた結果というのがもう1点

ここまで見た
  • 627
  •  
  • 2017/10/27(金) 21:08:26.73
>>626
なるほど、そういう機能なのか。
(日本語もちゃんと意味を理解して訳してるんだね)

理解できたよ。
ありがと。

ここまで見た
  • 628
  •  
  • 2017/10/29(日) 17:26:34.66
>>601
ノーマルモードで2つのキーq: 連続押しするとexコマンド履歴が表示されるので
それ選択してクリップボードへ。
また :dis ってexモードで入力すると "で始まる各レジスタが表示される。
もしかしたら編集中のファイル名などコピペしたいのがあるかもしれない。

ここまで見た
  • 629
  •  
  • 2017/11/08(水) 12:12:30.72
cygwin の vim と kaoriya の gvim を併用しています
nerdtree において、259 文字以上のパスの場合、
cygwin の vim はそのファイルが表示されます
kaoriya の gvim はそのファイルが表示されません

後者の nerdtree において max_path を超えるパスを扱える方法はあるでしょうか

プラグインと設定ファイルはどちらも同じものを読み込んでます
kaoriya 付属の設定が原因かもですが、特定方法が分かりません

ここまで見た
  • 630
  • 629
  • 2017/11/13(月) 13:11:31.88
netrw も同じ症状でした
kaoriya は内部でwin32 api の制限を受けてるってことなんでしょうかね

ここまで見た
  • 631
  •  
  • 2017/11/13(月) 18:11:05.12
>>630
Kaoriya版はVisualC++でコンパイルしたネイティブのWindowsアプリなので
Windowsの制限をモロに受けると思う

ここまで見た
  • 632
  •  
  • 2017/11/13(月) 19:48:42.85
cygwin もネイティブのWindowsアプリなのでWindowsの制限を受けるのは同じ

ここまで見た
  • 633
  •  
  • 2017/11/13(月) 20:38:21.25
>>632
うーんじゃあファイル名の長さ制限は別の要因によるのかなあ
まあ自分もかつて両方使って環境変数の競合によるトラブルに悩まされた経験があるので
そもそもCygwinのVimとKaoriyaのVimは併用すべきでないと思う

ここまで見た
  • 634
  •  
  • 2017/11/19(日) 13:35:29.94
Win32 APIは特別な対策をしなければMAX_PATH文字までしか使えない。
Cygwinはその特別な対策をしているが、Win32版は何もしていない。

ここまで見た
  • 635
  •  
  • 2017/11/29(水) 01:43:35.26
GVimってなんでダメなの?

ここまで見た
  • 636
  •  
  • 2017/11/29(水) 11:16:58.03
誰がダメだと言ってたの?

ここまで見た
  • 637
  •  
  • 2017/11/29(水) 13:53:19.92
VIP板のプログラミングスレの人達が言ってた

ここまで見た
  • 638
  •  
  • 2017/11/29(水) 13:59:35.80
GVIPならよかったんじゃね?

ここまで見た
  • 639
  •  
  • 2017/11/30(木) 09:04:35.33
linuxなら使わんけど
windowsなら普通に使う

ここまで見た
  • 640
  •  
  • 2017/11/30(木) 09:40:33.28
Gvimがダメなんじゃなくて
Gvimがダメとか言ってる人たちがダメなんでしょ
弘法筆を選ばず
Windowsのメモ帳だってコードは書ける

ここまで見た
  • 641
  •  
  • 2017/11/30(木) 15:14:08.43
まあcatよりはマシかもね

ここまで見た
  • 642
  •  
  • 2017/11/30(木) 17:23:03.64
挿入モードでカーソルを行末に持って行くのに、C-o $でやっているのですが他に方法って有りましたっけ。

ここまで見た
  • 643
  •  
  • 2017/11/30(木) 17:35:50.97
End

ここまで見た
  • 644
  •  
  • 2017/12/01(金) 08:01:01.83
思考を放棄して ESC A してる

ここまで見た
  • 645
  •  
  • 2017/12/01(金) 13:20:44.67
>>643
それって入力中の文字列の最後に行くだけじゃないっけ

ここまで見た
  • 646
  •  
  • 2017/12/01(金) 13:40:07.04
C-eを<End>にcnoremapしてる

ここまで見た
  • 647
  • 642
  • 2017/12/01(金) 14:17:12.52
様々なご意見ありがとうございます。

MacbookなのでEndがないのと、ホームポジションからなるべくキーを離したくないのです。
今まではESC AまたはC-[ Aだったのですが、最近ようやくC-o $を知りました。
どのみち2ストロークだよなあ、と思って質問してみました。
vimrc弄ってマッピングするのは盲点でした。検討してみます。

ここまで見た
  • 648
  •  
  • 2017/12/01(金) 20:09:15.11
>>645
嘘でした。ちゃんと行末に飛びます
ごめんなさい

ここまで見た
  • 649
  •  
  • 2017/12/01(金) 22:13:17.49
>>647
Fn+rightキーでend

ここまで見た
  • 650
  •  
  • 2017/12/02(土) 06:25:06.47
未だにAltってマップ出来ないの?

ここまで見た
  • 651
  • 642
  • 2017/12/02(土) 15:25:27.28
>>649
ホームポジションから離れるので遠慮しておきます。ありがとうございます。

ここまで見た
  • 652
  •  
  • 2017/12/02(土) 18:04:49.08
フットペダルの出番ですね!?

ここまで見た
  • 653
  • 642
  • 2017/12/03(日) 01:34:39.27
>>652
バランスチェアで仕事しているため、足が床に着かないのでそれは無理です。

ここまで見た
  • 654
  •  
  • 2017/12/03(日) 10:23:47.82
vim を使用しているとき矢印キーを不能にしたくて、
試しに :noremap! <Up> <Nop> としましたが、
インサートモードでおかしな挙動をします。
1つ上の行に1文字 A が挿入されます。

不可解です、これはどう言うことでしょうか?

コマンドラインモードでは問題なく意図通りになっています。

ちなみに、:noremap! <Del> <Nop> もインサートモードでの挙動が変です。
こちらはカーソルのすぐ左の1文字の大小が入れ替わり、
かつノーマルモードへ戻ってしまいます。

:noremap! <BS> <Nop> はインサートモードでも意図通りになりました。

ここまで見た
  • 655
  •  
  • 2017/12/03(日) 10:28:33.55
>>654
ごめんなさい。
あせって質問する前に落ち着いてしっかりリサーチすべきでした。

互換モードが絡んでいたのですね。

解決しました。

お絵かきランド
フリック回転寿司
ここまで見た

★お気に入り追加

このページを共有する
facebook twitter hatena line google mixi email