2013-11-28 5 views
5

誰もが知っているように、:source現在のバッファーで:so %することができます。Vim:方法:バッファの一部をソースにする

しかし時には私は:sourceバッファーの一部だけで、バッファー全体ではありません。さて、私はちょうど私の.vimrcに何かを追加し、その部分をソースしたいと思いますが、私は残りのものをすべて再ソースしたくありません。

私は選択したテキストと:so(実際には:'<,'>so)を試しましたが、範囲が許可されていないと報告されました。だから、どうすればこのことができますか?

もちろん、必要な部分を一時ファイルに保存してソースすることもできますが、明らかに迷惑です。あなたが現在の行または渡された範囲で動作し、次のコマンド、定義することができ

答えて

2

おかげで、私は彼の主要なアイデアを取り、それを改善しています。私は改善するために何を望むか:

  • 私たちは、代わりに標準:soの追加のユーザー指定のコマンド:Executeを使用する必要があります([OK]を、私たちはユーザー指定のコマンド:Soに名前を付けることができ、いずれにせよ、それはコマンドの新しい大文字のバージョンを使用して迷惑なんです)
  • 副作用がほとんどありません:コマンドを実行すると、レジスタ@zが壊れています。以下の私のスクリプトで

、我々は以前のように:so {file}コマンドを使用することができ、我々はまた、範囲でそれを使用することができます::'<,'>so(実際:'<,'>Sourceに展開する)

ここ

" This script provides :Source command, a drop-in replacement for 
" built-in :source command, but this one also can take range and execute just 
" a part of the buffer. 
" 


" Sources given range of the buffer 
function! <SID>SourcePart(line1, line2) 
    let tmp = @z 
    silent exec a:line1.",".a:line2."yank z" 
    let @z = substitute(@z, '\n\s*\\', '', 'g') 
    @z 
    let @z = tmp 
endfunction 



" if some argument is given, this command calls built-in command :source with 
" given arguments; otherwise calls function <SID>SourcePart() which sources 
" visually selected lines of the buffer. 
command! -nargs=? -bar -range Source if empty("<args>") | call <SID>SourcePart(<line1>, <line2>) | else | exec "so <args>" | endif 



" in order to achieve _real_ drop-in replacement, I like to abbreviate 
" existing :so[urce] command to the new one. 
" 
" So, we can call :so % just as before, and we are also call '<,'>so 

cnoreabbr so  Source 
cnoreabbr sou Source 
cnoreabbr sour Source 
cnoreabbr sourc Source 
cnoreabbr source Source 
+1

'cnoreabbr'を使うときは注意が必要です。予期しない場所で展開されます。検索。詳細については、この記事を参照してくださいhttp://stackoverflow.com/questions/7513380/vim-change-x-function-to-delete-buffer-instead-of-save-quit –

+0

@PeterRincker、あなたのノートに感謝します。 。 –

3

:インゴKarkatへ

":[range]Execute Execute text lines as ex commands. 
"   Handles |line-continuation|. 
command! -bar -range Execute silent <line1>,<line2>yank z | let @z = substitute(@z, '\n\s*\\', '', 'g') | @z 
+0

ありがとう、私はあなたの主なアイデアを取って、それを改善しました、興味があれば私の答えを見てください。 –

1

1行のみを選択した場合、次のように動作します。

yq:p<enter> 

これも動作します:

ファイル(または範囲)を調達するために以下のマッピングを持っていないのはなぜ
y:<control-r>"<enter> 
4

:今

" source the current file 
nmap <leader>vs :source %<CR> 
" source a visual range 
vmap <leader>vs y:@"<CR> 

あなたmapleaderがある場合、あなたは(,vsを押すことができます, )、選択された範囲がソースされるか、そうでなければ、通常モードでは、現在のファイルがソースになります。

関連する問題