Learning the vi Editor/Vim/Vim on Windows

Vim is available for Microsoft Windows, but there are many issues attendant to that platform that make effective use of Vim quite challenging. This section deals with some of the issues relevant to users who are using or considering Vim for use on Windows systems.

Installation
There are a variety of installation options for users who wish to install Vim on Windows.

These include:
 * Self-installing executable
 * Win32s GUI executable
 * Windows 3.1 GUI executable
 * Win32 console executable
 * Win64 binaries for x64

Moreover, if desired, a user may compile Vim from source. This may be useful or even necessary if the user wants to add support for additional options that are not compiled into one of the pre-existing binaries by default. Perhaps the most common scenario for compiling on Windows is when the user wishes to add support for a programming language (either a specific language, or a specific version of the language) that is not included in the Windows binaries by default.

When installing Vim, the user has to accommodate for any required elements that do not come with Windows by default, such as a compiler and make.

General usage
Users who are not well-acquainted with how Vim works, and the general "vi way of doing things", may find Vim especially challenging. This is especially so, if they are already comfortable with the workflow of most other text editors on Windows. Because of this, there's actually more than one way of doing things if you want to use Vim on Windows. One way of using Vim on Windows can be called standard vim workflow (Vim); another way would be the windows vim workflow (WinVim).

Using the "WinVim" style definitely has advantages for those users who are not amenable to the steep learning curve commonly associated with Vim; however, there are many features within Vim that are difficult to use when working from the "WinVim" paradigm. Whether one chooses one usage pattern over the other, or some combination of the two, is largely a matter of personal preference.

WinVim behaviour levels
The  configuration allows a user to set the editor behavior to reflect some aspects of the "WinVim" working style. This enables a 'scaled-down' version of the WinVim style; users who want a very detailed emulation of WinVim style, will have to do more than just set 'behave mswin'. See  for more details.

Cream editor
The Cream editor is an example of a Vim configuration that is designed for users who prefer the "WinVim" style of working.

Compatibility
For those who are familiar with UNIX-like operating systems, and leverage such systems to enhance and extend Vim, the Windows operating system may present some unexpected differences and limitations.

Path separators
Windows (by default) uses the backslash character to delimit path-steps in file paths. This can be challenging for users who are not used to this. See  for more details.

Command piping
The Windows command shell does not support command piping and redirection in the same way as UNIX systems. Some users may find this especially challenging, because it significantly limits the way Vim can interact with other programs external to the editor. There are workarounds, however, that allow a user to approximate some of the power that comes natively from piping and redirection.

Temporary text transport file
A temporary text transport file is one workaround that allows Vim to interact with other programs on Windows without requiring use of pipes and redirection. The basic approach is to specify one or more temporary files on the local file system that Vim and external programs use to "transport" text between each other.

Fonts and language support
In Windows XP, gVim 7.4 (7.4.280) has issues displaying non-Western characters. Even if a character is not visible, gVim retains the characters, and the same text should appear ok in a program that supports more fonts, such as an office package or a web browser.

The displayable font can be changed via  menu &gt; , where a font can be selected for a particular language. The Font window contains a font list of only monospace fonts, which makes the font selection scarce. An existing non-Western font can be selected, and depending on which script a font supports, the Sample area for a selected script (at ) will show a non-Western script sample alongside Western characters. To confirm, whether a certain language script is supported, open the  drop-down menu. For example, fonts that support Korean, have Hangul in the  drop-down menu.

For most Western scripts, the following table shows a non-exhaustive selection of open-source monospaced fonts visible to gVim that offer the most language support and best legibility. The fonts must be downloaded separately, but can come with a dedicated software package. The Windows-default Lucida is displayed for comparison. (Font size requirements may differ user-by-user.)

Comparison with CUA-style editors
The following table shows a comparison of some basic Vim functionality as viewed from the perspective of CUA -style editors.

This is intended as a starting place for those who may be unfamiliar with Vim, but familiar with Windows-based editors that use a standard "File :: Edit :: Help" style menu, such as Notepad.exe, which is available on most Windows installations by default.

file                          ;;   :h files                                ;;  blank___ file                          ;;   :h buffers                              ;;  blank___ file.exit                     ;;   :qa                                     ;;  close all files and quit file.explore                  ;;   :Vexplore. ;; (:h :Vexplore) file.explore                  ;;   vim. ;; startup on a directory file.open                     ;;   :e. ;; open directory file.open                     ;;   :e /foo                                 ;;  open directory file.open                     ;;   :e /foo/bar.txt                         ;;  open file file.open.hyperlink           ;;    f	                                ;;  open in a new window (Ctrl-w f) file.open.hyperlink            ;;   gf                                      ;;  open in same window file.open.hyperlink           ;;   gf                                 ;;  open in a new tab (Ctrl-w gf) file.reload                   ;;   :edit                                   ;;  reload to last-saved version of the file file.revert                   ;;   :edit                                   ;;  revert to last-saved version of the file file.save                     ;;   :w                                      ;;  write the current buffer to file file.save_all                 ;;   :wa                                     ;;  save all modified buffers file.save_and_quit            ;;   ZZ                                      ;;  :help ZZ "write the current file and quit

autocorrect                   ;;  :help abbreviations                      ;;  blank___

cursor                        ;;  :help motion.txt                         ;;  cursor motions and selections cursor.back                   ;;                                         ;;  :help  cursor.move                   ;;  arrow keys                               ;;  the CUA way cursor.move                   ;;  hjkl                                     ;;  the vim way cursor.top_of_file            ;;  gg                                       ;;  compare to c-home in CUA editors cursor.top_of_file            ;;  :normal gg                               ;;  blank___

edit                          ;;   blank___                                ;;  blank___ edit.cut                      ;;   blank___                                ;;  blank___ edit.copy                     ;;   blank___                                ;;  blank___ edit.copy_line                ;;   yy                                      ;;  copy (yank) the entire line edit.cut.by_pattern           ;;   :g/pattern/y A                          ;;  "./try-basicops-edit.txt.txt" edit.find                     ;;   /                                       ;;  blank___ edit.find_in_files            ;;   vimgrep                                 ;;  "./try-basicops-find-replace.txt" edit.find_results             ;;   :g//                                    ;;  href="C:/sm/docs/mydaydirs/2013/week11/vim-cua-learnbit.txt" edit.paste                    ;;   blank___                                ;;  blank___ edit.select.line              ;;   blank___                                ;;  blank___ edit.select.all               ;;   blank___                                ;;  blank___ edit.select.pargraph          ;;   blank___                                ;;  blank___ edit.preferences              ;;   see preferences                         ;;  blank___ edit.currentfile.prefs        ;;   see preferences                         ;;  blank___

edit.change.uppercase          ;;                                          ;; change text to uppercase

edit.delete_blank_lines       ;; :g/^\s*$/:delete edit.slash_forward            ;;   :{range}s/\\/\//                        ;;  | echo "slash forward" edit.slash_back               ;;   :{range}s/\//\\/                        ;;  | echo "slash back" edit.slash_forward            ;;   :s=\\=/=g                               ;;  | echo "slash forward" edit.slash_back               ;;   :s=/=\\=g                               ;;  | echo "slash back" edit.sort.file                ;;   :sort                                   ;;  :h sort edit.sort.range               ;;   :{range}sort                            ;;  :h sort   :h range edit.sort.paragraph           ;;   blank___                                ;;  blank___ edit.sort.unique              ;;   :{range}sort u                          ;;  blank___ edit.ws_trim                  ;;   :%s=\s\+$==                             ;;  trim trailing whitespace

insert                        ;;   :help insert                            ;;  insert is a separate "mode" in vim insert.autocomplete           ;;   ctrl-x // ctrl-n // ctrl-p              ;;  blank___ insert.date                   ;;   google://vim insert date                ;;  insert current system date. there are multiple ways to do this insert.date (linux )          ;;   :r !date                                ;;  blank___ insert.date (windows)         ;;   blank___                                ;;  blank___ insert.directory_list         ;;   :r ! ls -al;                           ;;  blank___

search                        ;;   blank___                                ;;  blank___ search.matching lines         ;;   :g/{pattern}/:print                     ;;  print all lines matching pattern search.matching lines         ;;   :g/{pattern}/:print                     ;;  print all lines matching pattern

code.syntax_coloring          ;;   :set ft=php                             ;;  blank___

navigate.home                  ;; 1G                                       ;; go to top of file navigate.home                  ;; gg                                       ;; go to top of file navigate.home                  ;; 1gg                                      ;; go to top of file navigate.end                   ;; 9999gg                                   ;; go to end of file (assumes file is shorter than 9999 lines) navigate.end                   ;; G                                        ;; go to end of file

preferences                   ;;   vim ~/.vimrc                            ;;  easy editing of preferences preferences.komodo            ;;   compare preferences pane in komodo      ;;  "C:\sm\docs\mydaydirs\2012\week36\editor-preferences-pane-001.png" preferences.komodo            ;;   current file preferences in komodo      ;;  "C:\sm\docs\mydaydirs\2012\week36\editor-preferences-pane-001.png" preferences.appearance        ;;   :set showcmd                            ;;  show keystrokes that you have typed in normal mode preferences.cursor_position   ;;   :set ruler? ;; blank___ preferences.line_num          ;;   :set number // :set nonumber            ;;  blank___ preferences.filetype          ;;   :set ft=php                             ;;  blank___ preferences.setting_change    ;;   :set ft=                                ;;  blank___ preferences.setting_view      ;;   :set ft?                                ;;  blank___ preferences.syntax_coloring   ;;   :set ft=php                             ;;  blank___ preferences.keyboard          ;;   :map                                    ;;  display key mappings

tools.interop                 ;;   :helpgrep away and come back            ;;  blank___ tools.python                  ;;   :echo has("python")                     ;;  blank___ tools.external                ;;   :! drush cc all;                       ;;  example running drush tools.external                ;;   :! git commit -a -m "%:t"              ;;  example running git with interpolated current filename tools.run                     ;;   :! git commit -a -m "%:t"              ;;  run the current file in another program tools.run                     ;;   :! git commit -a -m "%:t"              ;;  run the current file as a script tools.macro                   ;;   :helpgrep big changes                   ;;  "./try-basicops-tools.txt" tools.repeat_command          ;;                                       ;;  "./try-basicops-tools.txt" tools.normal_command          ;;   :normal                                 ;;  blank___

tools.scripting               ;;     :help user-function                   ;;  creating custom functions in vim tools.scripting               ;;     :help vim-script-intro                ;;  creating custom functions in vim

window                        ;;    :help window                           ;;  "./try-basicops-windows.txt" window.close_others           ;;    :only                                  ;;  blank___ window.equalize               ;;    ctrl-w =                               ;;  equalize the size of all windows window.history.navigate       ;;    :pop :tag                              ;;  :h tag window.history.forward        ;;    :ta[g]                                 ;;  :h ctrl-] window.history.back           ;;    ctrl-O                                 ;;  :helpgrep tutorial // :help usr_01 // window.history.back           ;;    :po[p]                                 ;;  blank___ window.rotate                 ;;    ctrl-w ctrl-r                          ;;  :help window-moving window.rotate                 ;;    ctrl-w r                               ;; window.reshuffle              ;;    ctrl-w H                               ;;  two_handed_cmd window.reshuffle              ;;    ctrl-w J                               ;;  two_handed_cmd window.reshuffle              ;;    ctrl-w K                               ;;  two_handed_cmd window.reshuffle              ;;    ctrl-w L                               ;;  two_handed_cmd window.resize                 ;;    :resize +10                            ;;  height increase current window size window.resize                 ;;    :resize -10                            ;;  height decrease current window size window.resize                 ;;    :vertical resize -10                   ;;  width decrease current window size window.resize                 ;;    :vertical resize +10                   ;;  width increase current window size window.resize                 ;;    ctrl-w =                               ;;  (aka window.equalize) window.split                  ;;    :split                                 ;;  blank___ window.split                  ;;    ctrl-w s                               ;;  blank___ window.navigate               ;;    ctrl-w + ctrl-w                        ;;  move cursor cycle thru all windows window.scrolling              ;;    :set scrollbind                        ;;  dual pane windows scroll together window.split.vertical         ;;    ctrl-w v                               ;;  blank___ window.split.vertical         ;;    :vsplit                                ;;  blank___ window.split.close            ;;    :close                                 ;;  closes the currently focused split window.split.close            ;;    ctrl-w q                               ;;  closes the currently focused split window.navigate               ;;    ctrl-w + arrow keys                    ;;  move cursor around between split windows (mouse_alternative) window.tabs                   ;;    :h tabs                                ;;  blank___ window.tabprevious            ;;    :tabprevious                           ;;  blank___ window.tabnext                ;;    :tabnext                               ;;  blank___ window.tabnext                ;;    gt                                     ;;  blank___ window.tabmove                ;;     (windows)                 ;;  requires MyVim_MoveTabPage window.tabmove                ;;    :tabmove N                             ;;  :tabmove 0 makes it the first tab // :help :tabm

help                          ;;   :help // :h // :help help               ;;  overview of the help system help.find                     ;;   :helpgrep /pattern/                     ;;  search for a term in the help system (see also :copen) help.context_specific         ;;   :helpgrep help-context                  ;;  shows the different contexts for which you can get help help.autocomplete             ;;   ctrl-d                                  ;;  shows completions for vim help


 * 1) [cross-reference: influx_either_kevin_pay]
 * 1) [cross-reference: influx_either_kevin_pay]