76

标题非常具有描述性。以防万一,我举个例子:

START BLOCK1
something
END BLOCK1

START BLOCK2
something
somenthing...
END BLOCK2
  1. 我选择BLOCK1可视模式
  2. 我按一下y
  3. 如何将被拉到的文件保存BLOCK1到其他文件?
4

8 回答 8

138

在线条视觉或块视觉模式下选择要保存的文本,然后

:w new.txt

这就是您键入的内容,但您实际上不会确切地看到上面的内容。当您按下 时:,您将转到命令行,该命令行将自动填写选择信息。它看起来像这样:

:'<,'>

只需继续输入其余的 ( w new.txt) 即可获得

:'<,'>w new.txt

...然后按 Enter。

于 2009-04-28T21:37:30.067 回答
17

选择块后,您可以:'<,'>w other-file,这将只将选定的块写入other-file。在可视:模式下点击应该'<,'>已经为您放入命令行,因此您实际上只需键入:w other-file.

于 2009-04-28T21:36:51.940 回答
7

可能有一种更简单的方法可以做到这一点,但我要做的是创建一个新缓冲区(或选项卡),然后将其粘贴到p. 您可以使用 . 创建新缓冲区:new或使用:tabnew. 您可以使用:w filename.

于 2009-04-28T21:32:44.710 回答
3

就像评论中提到的@dronus 一样,:w !pbcopy建议没有正确复制,因为它复制了整行。如果我只想复制一行中的 url,我将无法做到。这是您可以添加到.vimrc文件中的一行,以便每次按 CTRL-C 时,vim 中选定的行将被复制到剪贴板:

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

如果您想阅读有关此功能的详细信息,可以在我的博客上阅读

它与@rmeador 建议的实现相同。

于 2014-01-09T21:25:21.883 回答
3

与@songz 的解决方案类似,我更喜欢使用 ":new"

vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>
于 2014-08-16T15:06:18.707 回答
1

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>
于 2018-12-14T20:00:05.100 回答
0

基于@chenkaie 的变体,对我来说效果很好:

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

于 2018-05-12T02:17:21.983 回答
0

除了上面选择的答案,

  • 使用鼠标选择 (1) 时,

  • 当只想部分复制行(2)时,只复制@dronus的评论提到的整行的问题:

(1) 在我的基于 Debian 的 DietPi (Raspberry PI) 系统中,当在我的 Ubuntu 16.04 工作站上使用鼠标进入并选择“视觉模式”时,vim 的行为与上述首选解决方案略有不同。然后

  • 你拉它

但如果我输入 ':' 作为命令,它不会与

'<,'>

我可以简单地添加我的

w new.txt

在它之后。所以我只是自己输入了它,它确实有效:

'<,'>w new.txt

并将整行复制内容复制到我的文件“new.txt”中,而“<,”似乎意味着“复制选定的行并“>”将其重定向到写入命令的引用文件。

(2)对于不粘贴部分行的问题,就像在@dronus评论中提到的那样,这个解决方案(选择的一个,第一个替代方案)对我有用:

编辑第一个文件,拉出你想要的文本。然后在 vi (:e /path/to/other/file) 中打开第二个文件并粘贴它(通过键入 p)。保存它(如上面的':w new.txt'。

然后它将只复制用鼠标或“y”标记的部分行。

[编辑] 在我的 Ubuntu 系统上:有时通过鼠标选择不会在 vim 中进入“视觉模式”。然后可以使用上下文菜单选择正常的复制/粘贴...我还没有找到 Ubuntu 将其行为从“客户端代理行为”更改为“主机”行为的原因(Ubuntu 将 ssh bash 窗口托管到我的“客户')...

于 2019-08-29T05:52:11.937 回答