How do I preserve folds in VIM when cutting and pasting? - vim

In vim, you can create a fold with zf, so if is %, you can neatly fold a delimited block.
is there a way to select some text in visual mode and automatically fold that?
I've noticed that if I select a closed fold and use dd to delete it, then go somewhere else and use P to paste it, the fold will disappear and the fold will be expanded. I want to cut the folded stuff and paste it and have it paste with the folds still intact and closed.

You can do the first if you use :set foldmethod=manual and then simply highlight the block you want and use zf to fold it.
I don't think you can do this (at least, not without a script)

Vim has several different fold strategies; I assume you are talking about manual folding.
Unfortunately, yanking and pasting does not keep the fold in-tact. You may be able to create a script that will re-fold pasted text, but it seems like it would be more annoying than useful in the end.

Related

Moving codefolds in Vim

I have the following two code folds:
How would I move the bottom code fold above the top one? Is there a shortcut for that?
You can operate on a fold as a whole as if you're operating on a single line. So simply using dd here will cut the whole folded block.
See :help fold-behavior:
[...] When using an operator, a closed fold is included as a whole. Thus dl deletes the whole closed fold under the cursor.

Why is vim so slow with copy/paste?

I find myself copy-pasting text between editors a lot. Often with the result of SQL outputs that are usually about 10,000+ lines. I have never had a problem doing this -- usually it takes all of a second or two to paste it in. However, when I use vim, it takes about a minute to copy-paste in all that text, this is after settings :set no paste.
Is this supposed to happen in vim or is there some sort of setting I can change so this doesn't occur? I've tried TextMate, TextEdit, VSCode, etc, and vim is the only one with this issue related to copy-paste.
I think you should use :set paste instead.
Because :set no paste paste character per character and check if whether these character is matched with some key binding, some shortcut.

How to make vim with tree representation for indents, similliar to result of terminals "tree" command?

I'm looking for some way to connect indets into tree structure similliar to the one used by terminal tree command.
Something that interprets the indents in same way tree interprets file system.
Alternatively for sublime text or another text editor.
Edit: Apologies for the broadness of question, to specify what i wanna do is>
Rather then replacing the actuall text i just want it to interpet the indents into the tree structure while retaining the actuall file should retain it's indents.
You've asked a broad question (and did not show any research effort so far), so I all I can do is answering it broadly as well (for Vim):
permanent change
For a permanent change of the actual text, all you need is :substitute. A start would be
:%substitute/ \ze\S/└── /
To make this more beautiful, another pass could turn └ into ├ by comparing previous and current line; :substitute or :global can do this.
just visualization
If you don't want to actually manipulate the buffer contents, but just affect the visual appearance, :set list and the 'listchars' option come to mind. Unfortunately, though this can display spaces and tabs, it does so uniformly; i.e. you cannot just apply it to the "last" part of the indent. You have a chance to implement this with :help conceal; this can translate a (sequence of) character(s) to a single (different) character. This is based on syntax highlighting. You could define matches for fourth last space before non-whitespace and conceal that as └, and third and second last space before non-whitespace and conceal as ─, for example.
or a hybrid
Another approach would be a combination: Use (easier) modification with :substitute, but undo this before writing (with :autocmd hooks into the BufWritePre and BufWritePost events). If this is purely for viewing, you could also simply :setlocal nomodifiable or :setlocal buftype=nowrite to disallow editing / saving.

What's wrong with gVim copy paste between windows?

I'm new to vim and I'm using gVim on Windows. I have two windows open in the same gvim instance and I'm just trying to copy some code from one to another. For some reason when it pastes it replaces the contents of some code with literally this:
list.forEach(function(name){...}------------------------------------------
Obviously, my real code does not have ... or a ton of dashes. What the hell is happening?
The dashes (----------) give it away: The block of code has been folded. (You probably also see the line with different colors (depending on your colorscheme).) Depending on the filetype, folding can be manual or automatic. For your (JavaScript?) code, it's the latter. So when you paste a block of code, Vim automatically detects the block and folds it.
There's a whole lot of commands and options around folding. Read more about it at :help folding. If you find this too confusing (for now), turn it off via
:set nofoldenable
Just press zo on the dashes(-----)
Aside: Use zf on selected (v) lines to fold lines.
zo - Open
zo - Fold

Pasting text in vim. A tedious operation?

I've been using vim for somewhat longer than a year now and during this time I have never feel really comfortable with the way vim works with yanking and pasting text (or maybe it is just me not using it in the most efficient way)
For example, I have the word "World" yanked onto a register, and I want to paste it after "Hello". (Note that there are no spaces on either of the words). So, what I would do is
Hello
|
Place cursor here, and press "p". Then, what I will end up with is
HelloWorld
So, in order to avoid this, I have always to swith into insert mode, insert a espace, and go back into normal mode (or either make sure that the yanked word has a space before it). Be as it may, this is quite annoying behaviour I can't think of a solution for... Am I missing something here?
Suggestions will be appreciated.
Thanks
option zero
just live with what you have now.
option one
create a mapping for your workflow. for example
nnoremap <leader>p i<space><esc>p
option two
:set ve=all
then you could move your cursor to anywhere and paste
option three
you could in insert mode use <c-o> do normal mode stuff or <c-r> to get register values
I recommend option zero
You can use the Smartput : Adjust spaces and commas when putting text plugin for that. It modifies the p / P commands (this can be toggled on / off).

Resources