Uniform code indents/spacing between computers - vim

I frequently switch from working on my laptop to a school computer to a cluster machine Linux environment.
I get annoyed that code I write on Notepad++ on my laptop has different indents and spacing than the same code I open on my lab computer in Vim and vice versa.
For example, this code:
PetscInt xs,xw,ys,yw;
PetscReal lx,ly,dx,dy,dt,xp,yp;
PetscReal sim_time;
DM da,daKSP;
Vec gv,lv,bv,X,lX;
Becomes this code:
PetscInt xs,xw,ys,yw;
PetscReal lx,ly,dx,dy,dt,xp,yp;
PetscReal sim_time;
DM da,daKSP;
Vec gv,lv,bv,X,lX;
Is there a process I can adopt so that my code pretty much looks the same from computer to computer?
Thank you

Either make sure your softtabstop, tabstop, shiftwidth are the same as on your Notepad++, or make sure you use spaces, not tabs, for indentation (and set expandtabs in Vim).
I suggest adopting the latter solution, because tabs are a relic of the time when disk space was expensive, and because they are contextual and will mess up your code unless you have all the settings just right. Using spaces is foolproof, and all major editors support treating indentation spaces as if they were tabs anyway (e.g. deleting an indentation with a single backspace, converting Tab keypress into the appropriate amount of spaces, etc.) However, spaces vs. tabs is a matter of opinion/taste, and you might get the opposite recommendation elsewhere.

You can use http://editorconfig.org/ to maintain consistent configurations across editors and avoid such problems.

Related

Is it possible to have tabs inside a Vim buffer

Having multiple tabs in vim I've noticed that when I create a new buffer, this buffer stays inside the tab where I create it. Not being an expert at vim I expected the new buffer to behave like a new chrome window where I could put more tabs in. Is there a way to have a workspace like this in vim where when I switch buffers vim would show me a new set of tabs?
Thanks in advance!
That isn't how buffers work. Buffers are containers that hold and facilitate interaction with text. To use your Chrome analogy, this is like asking: how can I open new windows in my browser tabs? which of course you can't, beacuse that is not the interface is designed to work.
As I mentioned in the comments: tabs are containers for windows. Windows display buffers. Buffers hold text.
If a higher level of hierarchical abstraction is needed on top of tabs/windows, the best bet1 is probably to just open a new terminal window and start a separate instance of vim. That is even what is suggested here. I personally never use tabs, it's too clunky and I find it easier to flip between terminal sessions, which is second nature since I do that all the time anyway. The mechanics of vim tabs don't have that kind of "portability".
1: actually, the best bet is to close some of the unnecessary documents. If you're at the point where tabs and windows just aren't enough, adding more complexity isn't going to make you more efficient.

Why are my soft tabs showing as hard tabs?

I am editing files in VSCode (version 1.16.0) which were originally created in Emacs with indent-tabs-mode set to STANDARD. This was not set by me, but inherited, and, as far as I could tell, spaces were being inserted. Every indentation was 3 spaces, and the TAB key was used to achieve the indentation. That is what you saw in Emacs or if you more/cat the file from a command prompt. Like such:
data a;
set b;
x = 3;
run;
We have recently moved from a Solaris environment to Linux (Redhat 6) and, for a number of reasons, it behooves me to stop using Emacs in favor of VSCode. I have "editor.detectIndentation": false set in VSCode, with tabs inserting spaces, and the number of spaces set to 3.
When I open up these files in VSCode, however, the indentation looks off, like
data a;
set b;
x = 3;
run;
and, thus, I've begun a process where I am re-indenting everything, so they will look right in the VSCode world. The fact that this will create a bunch of whitespace-difference noise in version control is irrelevant in this particular case. Progress demands we move on and live with some short-term pain in that regard.
So, I delete all indentation and re-indent with the tab settings outlined above and all looks well in VSCode. Everything's lined up. I have 3 spaces per indent. Back to my first example above.
However, if I more/cat out the code now, it appears as if hard tabs have been used, so it looks awful (like my second example). And we do a lot of quick code inspection thru this means, so it's a highly undesirable effect. Why is this happening?
Everything I've seen online focuses on how VSCode handles soft/hard tabs, or problems with that functionality. Essentially, people are asking how to get the settings to what I've set above. I haven't seen anyone with my problem -- i.e. I believe I have the VSCode setting correct, it looks good and proper in VSCode, but looks like hard tabs were inserted instead of spaces when a simple more/cat is performed. (As a side note, if I open the files in Emacs after this, it also looks like hard tabs were used)

Using vim to develop instead of Emacs on Windows

I have used Emacs for a long time, say, 6 or 7 years. And it seems that I got Emacs Pinky somehow. Now I am trying to switch to vim, and it's a very good editor, just like Emacs, except that I wonder how you guys develop with it.
Using Emacs with a buffer running shell, I code, compile, debug, profile or do anything. But vim is just an editor. I still don't know how to quick edit in command mode, where everything go back to stone age. Should I use other tools, like screen, as the environment, and vim just the editor?
FYI, I mainly work on Windows.
For those Emacs users wishing to have a Vim experience in terms of keyboard shortcuts and certain functions specifically designed to duplicate Vim behavior, the original poster may wish to consider using evil-mode:
http://www.emacswiki.org/emacs/Evil
In addition, the user may wish to configure his/her own keyboard shortcuts that make more sense based upon any physical limitations (e.g., pain in certain digits, etc.).
Finally, there is no requirement that a user keep his/her hands on the home row and stretch for the control/alt/command keys with a pinky. It is possible to type 100 words per minute or faster, hit keyboard shortcuts using two hands away from home row, and return to the home row blindfolded.

multi-column terminal multiplexer?

Let me explain what I'm looking for, hopefully for the terminal, but if it exists in an IDE, i'll take that too.
I have a laptop with a 1366x768 resolution screen; I use vim for code-writing, and I use a fairly small font in my terminal (~7pt). So, as you might imagine, there's a lot of "wasted" horizontal space, especially when coding in a compact language like python.
I just checked and found that with a 6pt. font, the maxyx of my terminal is 82 rows x 271 columns. What I'd like to have, essentially, is a single terminal with the dimensions of 246 rows x 90(89?) cols, split into 3 panes and displayed side by side. But, they would need to behave as one contiguous vertical pane, i.e., when i scroll in my editor, all three of them scroll synchronously.
Does anyone know of a hack or anything to accomplish this? Maybe for vim/screen/similar?
Patching screen might be a fun project, but I don't have time to chase that rabbit. If someone out there does, though, I'll order them a pizza or something ;)
(although if i get around to it first, i'll have to order myself a pizza)
I had the very same desire and others want this as well. Lacking any options I implemented my own two column virtual terminal. See the --columns option for selecting a different number of columns than two.
EDIT: based on comments, I now understand the requirement better. i.e. viewing one text file in a newspaper-like multi-column format.
It seems more like an editor feature rather than a multiplexer feature (because the 2 editors should be linked). Thanks to #romainl for mentioning :set scrollbind. This seems capable of doing the job in combination with some additional vim magic.
Here's an superuser q&a showing how to use scrollbind for your purposes: https://superuser.com/questions/243931/how-do-i-maintain-vertical-splits-with-scrollbind-in-vim .
Original answer:
vim and [recently] screen both offer vertical-split, as does tmux.
I don't know about any way to scroll simultaneously, but tmux's 'synchronize-panes' does offer simultaneous input. Can be useful!
For vim, use :vsplit
For screen (recent versions), use C-a |
Alternative to screen, I use tmux. It offers (default keys)
C-b %, then you can use C-b :setw synchronize-panes for
simultaneous input across panes.
Hope this helps.

Reasons for using command line Vim versus GUI Vim [closed]

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
Closed 9 years ago.
Background
I'm building an application where it detects what documents you're using from the file system. To do this it must access the AXDocument attribute of the active window. MacVim provides this. Running Vim in the Terminal wouldn't provide this.
I've just put out a survey to ask what editor coders who are interested in my app use. A significant number of the folk using Vim used it directly from the command line.
Why not use a GUI Vim?
Why do some people prefer to run Vim this way versus a GUI implementation like MacVim?
What advantages does this offer? As I understand it, you can send files to MacVim from the command line just as easily as command line Vim.
These reasons may be different for each specific developer but my guess would be:
vim is pretty much vim on any platform. GUI implementations can
vary.
Familiarity - being familiar with vim does not nessecarily mean
being familar with vim wrapped ina
GUI - espectially given #1.
"Elite Complex" ;-)
No definite avantages to the users over cli vim.
One might not have access to a gui (think ssh) or simply force of habit.
Although I don't use any feature exclusive to the GUI version (never touch the mouse while editing) I find GVIM more pleasing to the eye for fonts rendering and color management. So the only reason to use the cli version is not having access to a graphic environment (like when accessing a remote machine via ssh). Using GVIM also allows reuse of the terminal it was called from without having to use screen.
being able to run vim under screen provides
reliability: it will stay alive if X or the terminal app crashes. not sure how applicable this is to the Mac.
the option to multiplex sessions within terminal tabs. I actually end up rarely using terminal tabs because of this. It's possible (albeit a bit confusing) to set up heirarchical screen sessions and move branches of them around. screen is super awesome. This also provides an additional layer of text buffering in which you can search by regexp — this is useful if you spawn a shell command that is pages long and you're looking for a particular word in there.
the ability to connect to an existing session from another computer or reconnect after a network outage
and friends
in addition to making it possible to use screen, the console vim provides better shell integration. Although it's possible to run shell commands from within gvim (again, I'm not sure how this applies to the Mac, I'm a linux guy), there are limitations. I rarely use a gui vim so I'm not sure about the exact limits. For example, ANSI color codes are removed. I find this annoying because I tend to interact with SCM that way, for example running :!git diff --cached to check the changes in the index before committing. It makes for a somewhat quicker and more satisfying (mmm, diffy!) read if it's colourized.
I used to feel that gvim was a big improvement for viewing diffs, but I've changed the background colour of my terminal to a dark non-black shade, and set
:highlight DiffAdd ctermbg=Black
:highlight DiffChange ctermbg=Black
:highlight DiffDelete ctermbg=Black
:highlight DiffText cterm=Bold ctermbg=None
The result of this is that in diff mode, differing text shows up with a black background, and unchanged text is coloured with the terminal background colour. For side-by-side diffs, this works wonderfully, since you can tell immediately based on the other side whether a given line is a change or add; for non-side-by-side you will be able to see an unchanged part in a changed line.
This means that you can leave syntax colouring on and still be able to see diffs. Again, you do need to be able to set the background colour of the terminal to a unique, dark, non-black shade. This facility is available in the terminal emulators that I use (yakuake/konsole and roxterm) and many others.^[?Mac^M"mya)^O^Op
This also assumes that you're using a colourscheme meant for use with a dark background colour; I use a modified delek.
Although I haven't tried this, there is also the option to run console vim in 256-colour mode on terminals which support that mode — which I believe includes most or all modern ones. This can serve to make much of the subtlety of GUI colorschemes available to console vim.^["mp
I also like it that it lives in the place where it was started, and starts up quick. So if I'm navigating around in the shell, as per my wont, I can edit a file without interrupting that flow or having to farm that operation out to a different piece of conceptual real estate. Having less things to keep track of is a big plus. Being able to background it is helpful, too, for example if I need to grab the contents of an unexported shell variable via xclip. If I'd spawned a GUI window instead I might have some trouble remembering where that shell was, or might have already closed it.
My main reason for using a gui vim at all is that it makes somewhat more sense as something spawned from a gui app, eg a browser. In practice I never do this, and I suspect that it's fairly equivalent to just have a new terminal window pop up with a new console vim in it. Though there is likely some (window manager) window management functionality that is exclusive to gui implementations. This is pretty similar to the use case you're discussing.
gvim is actually just a basic terminal emulator with vim running in it, and some menus and toolbar buttons up the top.
So if you have a good, full-featured terminal emulator already, you may as well use that instead, since you'll be using the same type of terminal window that you are familiar with across all your terminal sessions.
Another benefit is that it makes it easy to switch to a shell inside vim and then switch out seamlessly.
On Windows I prefer gvim. On Linux it's vim inside gnome-terminal, which is nice and configurable thankyou.
To avoid (or at least minimize) the use of the mouse.
some gvim variations can't handle
some of my hotkeys
some spawn separate window when i try
to compile program
sometimes they simply can't use fonts
like fixed or terminus correctly
(think about "terminus bold" - some
gvim variations simply stretch
"terminus normal" instead of
rendering with the separate font)
cli generally works faster than gui,
especially if running in real
textmode console (not possible on a
mac though)
there are almost no benefits in using
GUI version, and i'd loose ability to
run in screen, ssh, to suspend
process with ctrl+z, and many more.
The main reason I use the command line is that I spend most of my day in a terminal already, and my use of vim reflects this. I do not open up vim for a long while just editing different files then opening others without closing it; I usually open a file or two do a few edits then do some command line tasks, maybe change a directory, and open up vim somewhere else. When using the a gui there is substantial lag when opening the editor. This wouldn't bother me if I opened it once and left it open but I tend to not work that way. So the command line works better for my workflow. Furthermore since there is no real benefit feature-wise of the GUI over the command line and vise-versa, I've always just stuck with the command line since it suited me better.
vim is way more performant with huge files (100-500MB .csv or .xml files in my case).
gvim beats vim hands-down when used to compare files (gvimdiff): setting the font (want more content on the screen?), dragging the window split line (want to see more of one file rather than the other) etc.
Other than that, I haven't seen other mayor differences and use gvim except when working with large files because I find it more handy in a graphical environment (gnome).
Speed of rendering
proper shell integration with
suspend (C-z),
alternate terminal,
uniform copy/paste
nicer quickfix integration (all external programs run inside your terminal, instead of popup windows... )
network agnostic: can run over ssh
using GNU screen, can detach/attach session over internet;
To the sometimes mentioned 'downside':
mouse support is up to par with :se mouse +=a; this enables selection, window border dragging with the mouse, even over GNU screen over ssh
Pair coding via vim + gnu screen is the selling point for me. I work in screen/vim all day, it allows people to remote into my screen session and we can both edit files fluidly. It's so hot right now.
As a big vim user myself, although I know about GUI vims, I don't use them just out of habit.
I've been using vi since 1990, switched to vim a few years ago but still call it through an alias (alias vi=vim).
For me its just habit. vim works well as it is. Perhaps the gui offers more and I should explore it, but vim works just the way I expect it to and want it to.

Resources