web-dev-qa-db-ja.com

ビジュアルモードのテキストブロックをVimのファイルに保存するにはどうすればよいですか?

タイトルは非常にわかりやすいです。念のため、例を挙げましょう。

START BLOCK1
something
END BLOCK1

START BLOCK2
something
somenthing...
END BLOCK2
  1. BLOCK1ビジュアルモード
  2. 私は押すことでそれをヤンクします y
  3. ヤンクを保存するにはどうすればよいですかBLOCK1他のファイルに?

保存するテキストをラインビジュアルモードまたはブロックビジュアルモードで選択し、

:w new.txt

それはあなたがタイプするものですが、実際にはseeは正確には上にありません。 :を押すと、コマンドラインに移動し、選択情報が自動的に入力されます。次のようになります。

:'<,'>

残り(w new.txt)を入力し続けるだけで取得できます

:'<,'>w new.txt

... Enterキーを押します。

126
Rook

ブロックを選択すると、:'<,'>w other-fileを実行できます。これにより、選択したブロックのみがother-fileに書き込まれます。ビジュアルモードで:を押すと、コマンドラインに'<,'>が配置されるため、:w other-fileと入力するだけで済みます。

16
ephemient

おそらくもっと簡単な方法がありますが、私が行うことは、新しいバッファー(またはタブ)を作成し、pを使用して貼り付けることです。 :newを使用して新しいバッファを作成するか、:tabnewを使用して新しいタブを作成できます。 :w filenameを使用すると、通常どおりバッファ/タブをファイルに書き込むことができます。

5
rmeador

コメントで言及されている@dronusのように、:w !pbcopyの提案は行全体をコピーするため、正しくコピーされません。行のURLのみをコピーしたい場合、コピーできません。以下は.vimrcファイルに追加できる行です。CTRL-Cを押すたびに、vimで選択した行がクリップボードにコピーされます。

map <C-c> y:e ~/clipsongzboard<CR>P:w !pbcopy<CR><CR>:bdelete!<CR>

これが何をするかについての詳細を読みたい場合は、これについて 私のブログ で読むことができます。

@rmeadorの提案と同じ実装です。

2
songz

@songzのソリューションと同様に、私は ":new"を使用してこのようにするのが好きです

vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>
1
chenkaie

上記の 選択 回答に加えて、

  • マウスを使用して選択する場合(1)、

  • そして、@ dronusのコメントで言及されている行全体をコピーするだけの問題です。行を部分的にコピーしたいだけです(2):

(1)DebianベースのDietPi(Raspberry Pi)システムでは、Ubuntu 16.04ワークステーションでマウスを使用して「VISUAL MODE」を入力お​​よび選択すると、vimは上記の推奨ソリューションと少し異なります。その後

  • それをヤンクするy

コマンドに「:」を入力すると、

'<,'>

単純に追加できます

w new.txt

その後。だから私は自分でそれをタイプしただけでうまくいきました:

'<,'>w new.txt

そして、行全体のヤンクされたコンテンツをファイル「new.txt」にコピーしますが、「<」は「選択された行をコピーし、>」が書き込みコマンドの参照ファイルにリダイレクトすることを意味するようです。

(2)そして、@ dronusのように、行の一部を貼り付けないという問題に対して comment が言及されました this ソリューション(選択されたもの、最初の選択肢)が機能しました私のために:

最初のファイルを編集して、必要なテキストをヤンクします。次に、vi内から2番目のファイル(:e/path/to/other/file)を開き、(pと入力して)貼り付けます。それを保存します(上記の ':w new.txt'など)。

次に、マウスでマークされた行の一部またはカーソルで「y」をコピーします。

[編集]私のUbuntuシステムの場合:マウスで選択してもvimで「ビジュアルモード」にならないことがあります。次に、コンテキストメニューを使用して通常のコピー/貼り付けを選択できます... Ubuntuが動作を「クライアント動作」から「ホスト」に変更した理由はわかりません(Ubuntuがssh bashウィンドウをホストしている 'クライアント')...

0
pedda

Vimは視覚的な選択を取得してファイルに保存します。

function! Get_visual_selection()
    #Get the position of left start visual selection
    let [line_start, column_start] = getpos("'<")[1:2]
    #Get the position of right end visual selection
    let [line_end, column_end] = getpos("'>")[1:2]
    #gotta catch them all.
    let lines = getline(line_start, line_end)
    if len(lines) == 0
        return ''
    endif
    #Edge cases and cleanup.
    let lines[-1] = lines[-1][: column_end - 2]
    let lines[0] = lines[0][column_start - 1:]
    return join(lines, "\n")
endfunction

function Save_visually_selected_text_to_file()
    let selected_text = Get_visual_selection()
    call writefile(split(selected_text, "\n"), "/tmp/something.txt")
endfunction

#the c-u does a union of all lines in visual selection.
#this goes in the vimrc
vnoremap <F10> :<c-u>call Save_visually_selected_text_to_file()<cr>
0
Eric Leschinski

@chenkaieのバリアントに基づいて、私にとってはうまくいきます:

let mapleader = "," let g:mapleader = "," vmap <leader>y y:new ~/.vbuf<CR>VGp:x<CR> nmap <leader>p :r ~/.vbuf<CR>

0
Jaime Asm