¿Cómo puedo guardar un bloque de texto en modo visual en un archivo en Vim?


El título es muy descriptivo. Por si acaso, daré un ejemplo:

START BLOCK1
something
END BLOCK1

START BLOCK2
something
somenthing...
END BLOCK2
  1. Selecciono el BLOCK1 en modo visual
  2. Lo jalo presionando y
  3. ¿Cómo puedo guardar el yanked BLOCK1 en algún otro archivo?
Author: Keith Pinson, 2009-04-29

6 answers

Seleccione el texto que desea guardar, en modo visual de línea o en modo visual de bloque, y

:w new.txt

Eso es lo que escribes, pero en realidad no verás exactamente lo que está arriba. Cuando presione :, irá a la línea de comandos que se completará automáticamente con la información de selección. Se verá algo como esto:

:'<,'>

Seguir escribiendo el resto (w new.txt) para obtener

:'<,'>w new.txt

...y pulse intro.

 123
Author: Rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-26 17:36:32

Con el bloque seleccionado, puede :'<,'>w other-file, que escribirá solo el bloque seleccionado a other-file. Pulsando : en modo visual debería colocar '<,'> en la línea de comandos para usted ya, por lo que realmente solo tiene que escribir :w other-file.

 16
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 21:36:51

Probablemente hay una forma más simple de hacer esto, pero lo que haría es crear un nuevo búfer (o pestaña) y luego pegarlo con p. Puede crear un nuevo búfer con :new o una nueva pestaña con :tabnew. Puede escribir el buffer / tab en un archivo de forma normal con :w filename.

 4
Author: rmeador,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 21:32:44

Al igual que @dronus mencionado en los comentarios, las sugerencias :w !pbcopy no se copian correctamente porque copian toda la línea. Si quiero copiar solo la url en una línea, no podré hacerlo. Aquí hay una línea que puede agregar a su archivo .vimrc para que cada vez que presione CTRL-C, la línea seleccionada en su vim se copie al portapapeles:

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

Si desea leer detalles sobre lo que esto hace, puede leer sobre esto en mi blog

Es la misma implementación que lo que @ rmeador sugirió.

 2
Author: songz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-09 21:25:21

Similar a la solución de @songz, prefiero hacerlo así usando ":new"

vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>
 1
Author: chenkaie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-16 15:06:18

Basándose en la variante de @chenkaie, funciona bien para mí:

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

 0
Author: Jaime Asm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-12 02:17:21