[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bir Vim Sorusu



Merhaba,

* ahmet nurlu [2006-04-20 15:25:46-0700]
> Cevap icin tesekkurler. Simdi hersey istedigim gibi oldu. 
> 
> Acaba bazi komutlari yazim kipi(insert mode) icinde uygulamak  mumkun mu?
> Mesela:
> 
> imap <C-n> <up>
> 
> komutu ile  yazim kipinden(insert mode) ayrilmadan cumle cumle  yukari
> dogru gidebiliyorum. Ayni isi yazim kipinden ayrilmadan  cumle icinde
> kelime kelime  geriye(veya ileri) dogru gitmek istesem nasil yapabilirim? 

Tabii yapabilirsiniz.  VIM'de <c-o> tuşu var (bk. ":h i_CTRL-O"), "ekleme"
(veya sizin çevirinizle "yazım") kipinden çıkmadan bir "normal" kip
komutunu çalıştırmanız mümkün.  Aşağıdaki eşlemleri deneyin:

    inoremap <c-h> <c-o>w
    inoremap <c-h> <c-o>b

Ama yukarıdaki bu yöntemin şık olmayan tarafları var: her şey tekrar tekrar
elle yapılıyor ve eşlemlerde tutarsızlık olabiliyor.  Bu işi makineye
yaptırmakta yarar var. :-)  Ufak bir VIM işlevi yazdım aşağıda, bu
satırları ~/.vimrc dosyasına koyarsanız işler daha doğru yapılmış olur.
Üstün körü denedim, doğru çalışıyor gibi.  Sorun olursa yazarsanız.

----------------------------------->8--------------------------------------
" Seçilen kipler için (öntanımlı "hepsi") hedef tuş LMAP'a RMAP'taki
" normal kip işlevini atar.  Örnekler:
"
"	<n> tuşunu sadece "normal" ve "virtual" kipte
"	normal <k> işlevine ata:
"		RemapOnce n k nv
"
" 	<b> tuşunu (insert kipte <c-b> olarak) her üç
" 	kipte normal <j> işlevine ata:
"		RemapOnce b j
"
"	<f6> tuşunu her üç kipte normal </> işlevine ata
"	(insert kipte de <f6>):
"		RemapOnce <f7> /

fun! s:remap(lmap, rmap, ...)
        " Bu işlev pek akıllı değildir...
	let mode = (a:0 > 0) ? a:1 : 'a' " ama en azından kip seçebilir...

	if mode =~ '[an]'
		exe 'noremap ' . a:lmap . ' ' . a:rmap
	endif

	if mode =~ '[ai]' " ... veya insert kipte daha uyanık olabilir.
		if a:lmap =~ '^[[:alnum:]]'
			exe 'inoremap <c-' . a:lmap . '> <c-o>' . a:rmap
		else
			exe 'inoremap ' . a:lmap . ' <c-o>' . a:rmap
		endif
	endif 

	if mode =~ '[av]'
		exe 'vnoremap ' . a:lmap . ' ' . a:rmap
	endif

        " Diğer kipler gerekirse buraya eklenir.
endfun

" Bunu komut olarak çağırmak daha pratik olur.
com! -nargs=+ RemapOnce call s:remap(<f-args>)

" F klavyedeki tuşları VIMleştirelim.
RemapOnce n k
RemapOnce b j
" RemapOnce l l
RemapOnce k h
RemapOnce h w
RemapOnce j b
----------------------------------->8--------------------------------------

-- 
roktas



Reply to: