{"id":125,"date":"2026-10-12T10:01:45","date_gmt":"2026-10-12T10:01:45","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/04\/06\/vi-vim-editor-commands\/"},"modified":"2026-10-12T10:01:45","modified_gmt":"2026-10-12T10:01:45","slug":"vi-vim-editor-commands","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/vi-vim-editor-commands\/","title":{"rendered":"VI\/Vim Command Reference for DevOps Engineers: Modes, Search, Replace, Files, and Shell"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This guide is for DevOps engineers who edit configuration, scripts, and manifests directly on remote systems. It gives you a practical VI\/Vim command reference organized by real tasks, so you can move faster in terminal-only environments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2009-04-06; fully revised and updated.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2009\/04\/vi-vim-editor-commands.png\" alt=\"VI and Vim editor commands cheat sheet\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Quick terminal tip: exporting a man page to a text file<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post mentions <code>man ls | col -b &gt; ...<\/code>. In practice, provide an output filename. This writes a plain-text version of the man page (without backspace formatting characters):<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">man ls | col -b &gt; ls-manpage.txt<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">How Vim editing typically flows<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vim is modal. Most production editing follows a repeatable cycle: open, navigate, edit, search\/replace, save, and quit.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Normal mode<\/strong>: navigation and commands<\/li><li><strong>Insert mode<\/strong>: typing text<\/li><li><strong>Command-line mode<\/strong>: commands like <code>:w<\/code>, <code>:q<\/code>, and substitutions<\/li><li><strong>Visual mode<\/strong>: selecting text ranges<\/li><\/ul>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Open file in Vim] --&gt; B[Navigate in normal mode]\n    B --&gt; C[Search or jump to target]\n    C --&gt; D[Enter insert mode and edit]\n    D --&gt; E[Run substitute or format commands]\n    E --&gt; F{Need shell command}\n    F -- yes --&gt; G[Run :!cmd or :sh]\n    G --&gt; H[Return to Vim]\n    H --&gt; I[Write file]\n    F -- no --&gt; I[Write file]\n    I --&gt; J[Quit editor]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Save and quit commands compared<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Task<\/th><th>Command<\/th><th>When to use<\/th><\/tr><\/thead><tbody><tr><td>Quit (only if no unsaved changes)<\/td><td><code>:q<\/code><\/td><td>Safe exit when buffer is clean<\/td><\/tr><tr><td>Force quit without saving<\/td><td><code>:q!<\/code> or <code>ZQ<\/code><\/td><td>Discard local edits<\/td><\/tr><tr><td>Write and quit<\/td><td><code>:wq<\/code> or <code>ZZ<\/code><\/td><td>Standard save-and-exit flow<\/td><\/tr><tr><td>Write to another file and exit<\/td><td><code>:wq {file}<\/code><\/td><td>Save as a new path, then leave<\/td><\/tr><tr><td>Write selected range and quit<\/td><td><code>:[range]wq<\/code><\/td><td>Partial write workflows<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Essential Vim commands by task<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Open, read, and write files<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-vim\"><span class=\"hljs-selector-pseudo\">:e<\/span> <span class=\"hljs-selector-tag\">filename<\/span>\n<span class=\"hljs-selector-pseudo\">:e<\/span>!\n<span class=\"hljs-selector-pseudo\">:w<\/span>\n<span class=\"hljs-selector-pseudo\">:w<\/span> <span class=\"hljs-selector-tag\">newfile<\/span>\n<span class=\"hljs-selector-pseudo\">:1<\/span>,10 <span class=\"hljs-selector-tag\">w<\/span> <span class=\"hljs-selector-tag\">outfile<\/span>\n<span class=\"hljs-selector-pseudo\">:1<\/span>,10 <span class=\"hljs-selector-tag\">w<\/span> &gt;&gt; <span class=\"hljs-selector-tag\">outfile<\/span>\n<span class=\"hljs-selector-pseudo\">:r<\/span> <span class=\"hljs-selector-tag\">infile<\/span>\n<span class=\"hljs-selector-pseudo\">:23r<\/span> <span class=\"hljs-selector-tag\">infile<\/span>\n<span class=\"hljs-selector-tag\">gf<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Insert and edit text<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-vim\">a\nA\ni\nI\no\nO\n\nCtrl+a\nCtrl+x<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Search patterns<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-vim\">\/word\n?word\n\/jo&#91;ha]n\n\/\\<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fred\\<\/span>&gt;<\/span>\n\/\\d\\{4}\n\/^\\n\\{3}\n:bufdo \/searchstr\/<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Replace and bulk edits<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-vim\">:%s\/old\/<span class=\"hljs-keyword\">new<\/span>\/g\n:%s\/old\/<span class=\"hljs-keyword\">new<\/span>\/gc\n:<span class=\"hljs-number\">2<\/span>,<span class=\"hljs-number\">35<\/span>s\/old\/<span class=\"hljs-keyword\">new<\/span>\/g\n:<span class=\"hljs-number\">5<\/span>,$s\/old\/<span class=\"hljs-keyword\">new<\/span>\/g\n:%s\/^<span class=\"hljs-regexp\">\/hello\/g<\/span>\n:%s\/$\/Harry\/g\n:%s\/ *$<span class=\"hljs-comment\">\/\/g<\/span>\n:g\/string\/d\n:v\/string\/d\n:%s\/\\r<span class=\"hljs-comment\">\/\/g<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Buffers, splits, tabs, and explorer<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-vim\">:ls\n:b 2\n:e .\n:Sex\n:split filename\n:vsplit filename\n:hide\n:only\n\n:tabnew\ngt\n:tabfirst\n:tablast\n:tabm 2\n:tabdo %s\/foo\/bar\/g\n:tab ball\n\n:args\n:args *.php\n:grep expression *.php<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Run Unix commands from inside Vim<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-vim\">:!<span class=\"hljs-selector-tag\">pwd<\/span>\n:!<span class=\"hljs-selector-tag\">ls<\/span>\n!!<span class=\"hljs-selector-tag\">pwd<\/span>\n<span class=\"hljs-selector-pseudo\">:r<\/span> !<span class=\"hljs-selector-tag\">date<\/span>\n<span class=\"hljs-selector-pseudo\">:sh<\/span>\n<span class=\"hljs-selector-tag\">exit<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Useful options and syntax settings<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-vim\">:<span class=\"hljs-keyword\">set<\/span> all\n:<span class=\"hljs-keyword\">set<\/span>\n:<span class=\"hljs-keyword\">set<\/span> ai\n:<span class=\"hljs-keyword\">set<\/span> noai\n:<span class=\"hljs-keyword\">set<\/span> nu\n:<span class=\"hljs-keyword\">set<\/span> nonu\n:<span class=\"hljs-keyword\">set<\/span> list\n:<span class=\"hljs-keyword\">set<\/span> nolist\n:<span class=\"hljs-keyword\">set<\/span> showmode\n:<span class=\"hljs-keyword\">set<\/span> noshowmode\n:<span class=\"hljs-keyword\">set<\/span> ts=4\n:<span class=\"hljs-keyword\">set<\/span> ic\n:<span class=\"hljs-keyword\">set<\/span> noic\n:<span class=\"hljs-keyword\">set<\/span> smartcase\n:<span class=\"hljs-keyword\">set<\/span> autoindent\n:<span class=\"hljs-keyword\">set<\/span> smartindent\n:<span class=\"hljs-keyword\">set<\/span> shiftwidth=4\n:syntax on\n:syntax off\n:<span class=\"hljs-keyword\">set<\/span> syntax=perl<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use <code>:set nu<\/code> and <code>:set list<\/code> when editing YAML, Makefiles, or whitespace-sensitive files.<\/li><li>Prefer <code>:%s\/...\/...\/gc<\/code> over blind global replacement for production config changes.<\/li><li>Remember that some commands are <strong>Vim-specific<\/strong> (tabs, netrw explorer) and may not exist in minimal <strong>vi<\/strong>.<\/li><li>When you run shell commands via <code>:!<\/code> or <code>:sh<\/code>, verify your working directory and environment before writing changes.<\/li><li>If you suspect external file changes, reload with <code>:e!<\/code> before continuing edits.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A practical VI\/Vim reference for day-to-day DevOps work on Linux and Unix systems. Learn the commands you actually use: editing flow, save\/quit, search\/replace, splits, tabs, buffers, and shell integration.<\/p>\n","protected":false},"author":1,"featured_media":4018,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[63],"tags":[3066,378,3059,463,3065,3060,3064,3075,3078,3061,3085,3067,3069,3068,3063,3082,3073,3084,3079,3072,3071,3070,3081,3076,3080,3083,3074,3077,459,3062],"class_list":["post-125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ides-and-editor","tag-all-features-commands-in-vi-vim-editor","tag-commands","tag-editor","tag-vi","tag-vi-and-vim-tutorial","tag-vi-vim-editor","tag-vi-vim-editor-advantages","tag-vi-vim-editor-alignment-command","tag-vi-vim-editor-auto-completion-command","tag-vi-vim-editor-commands","tag-vi-vim-editor-commands-cheatsheet","tag-vi-vim-editor-commands-guide","tag-vi-vim-editor-commands-reference","tag-vi-vim-editor-commands-tutorial","tag-vi-vim-editor-features","tag-vi-vim-editor-file-editing-command","tag-vi-vim-editor-file-explorer-command","tag-vi-vim-editor-file-inserting-command","tag-vi-vim-editor-marks-command","tag-vi-vim-editor-read-write-files-command","tag-vi-vim-editor-replace-command","tag-vi-vim-editor-search-command","tag-vi-vim-editor-syntax-highlighting-command","tag-vi-vim-editor-tabs-command","tag-vi-vim-editor-text-indent-command","tag-vi-vim-editor-text-inserting-command","tag-vi-vim-editor-unix-interaction-command","tag-vi-vim-editor-window-spliting-command","tag-vim","tag-what-is-vi-editor"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=125"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/125\/revisions"}],"predecessor-version":[{"id":78974,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/125\/revisions\/78974"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4018"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}