834 Vim Commands: Vim Editor Cheat Sheet 2025


Access all 834 Vim commands in our ultimate Vim cheat sheet.

From basic text editing to advanced mode commands, cursor movements, and file operations – all organized by type.

List of All Vim Commands

CommandFunctionCategoryMode
hMove cursor leftNavigationNormal
jMove cursor downNavigationNormal
kMove cursor upNavigationNormal
lMove cursor rightNavigationNormal
gjMove cursor down (multi-line text)NavigationNormal
gkMove cursor up (multi-line text)NavigationNormal
HMove to top of screenNavigationNormal
MMove to middle of screenNavigationNormal
LMove to bottom of screenNavigationNormal
wJump forwards to start of wordNavigationNormal
WJump forwards to start of WORDNavigationNormal
eJump forwards to end of wordNavigationNormal
EJump forwards to end of WORDNavigationNormal
bJump backwards to start of wordNavigationNormal
BJump backwards to start of WORDNavigationNormal
geJump backwards to end of wordNavigationNormal
gEJump backwards to end of WORDNavigationNormal
%Jump to matching bracketNavigationNormal
0Jump to start of lineNavigationNormal
^Jump to first non-blank char of lineNavigationNormal
$Jump to end of lineNavigationNormal
g_Jump to last non-blank char of lineNavigationNormal
ggGo to first lineNavigationNormal
GGo to last lineNavigationNormal
{n}GGo to line nNavigationNormal
{n}ggGo to line nNavigationNormal
gdGo to local declarationNavigationNormal
gDGo to global declarationNavigationNormal
fxJump to next occurrence of xNavigationNormal
FxJump to previous occurrence of xNavigationNormal
txJump to before next occurrence of xNavigationNormal
TxJump to after previous occurrence of xNavigationNormal
;Repeat last f/t/F/T movementNavigationNormal
,Repeat last f/t/F/T movement backwardsNavigationNormal
}Jump to next paragraph/functionNavigationNormal
{Jump to previous paragraph/functionNavigationNormal
]]Jump to next sectionNavigationNormal
[[Jump to previous sectionNavigationNormal
][Jump to end of sectionNavigationNormal
[]Jump to end of previous sectionNavigationNormal
zzCenter cursor on screenNavigationNormal
ztPosition cursor at top of screenNavigationNormal
zbPosition cursor at bottom of screenNavigationNormal
Ctrl+eScroll down one lineNavigationNormal
Ctrl+yScroll up one lineNavigationNormal
Ctrl+bScroll up one pageNavigationNormal
Ctrl+fScroll down one pageNavigationNormal
Ctrl+dScroll down half pageNavigationNormal
Ctrl+uScroll up half pageNavigationNormal
Ctrl+oJump to older positionNavigationNormal
Ctrl+iJump to newer positionNavigationNormal
g;Go to older changeNavigationNormal
g,Go to newer changeNavigationNormal
giGo to last insert positionNavigationNormal
gvGo to last visual selectionNavigationNormal
g*Search word under cursor (partial)NavigationNormal
g#Search word under cursor backwards (partial)NavigationNormal
*Search word under cursorNavigationNormal
#Search word under cursor backwardsNavigationNormal
xDelete character under cursorEditingNormal
XDelete character before cursorEditingNormal
ddDelete current lineEditingNormal
DDelete from cursor to end of lineEditingNormal
d{motion}Delete text specified by motionEditingNormal
diwDelete inner wordEditingNormal
dawDelete a wordEditingNormal
dipDelete inner paragraphEditingNormal
dapDelete a paragraphEditingNormal
d$Delete to end of lineEditingNormal
d0Delete to start of lineEditingNormal
d^Delete to first non-blank characterEditingNormal
dGDelete to end of fileEditingNormal
dggDelete to start of fileEditingNormal
ccChange entire lineEditingNormal
CChange from cursor to end of lineEditingNormal
c{motion}Change text specified by motionEditingNormal
ciwChange inner wordEditingNormal
cawChange a wordEditingNormal
cipChange inner paragraphEditingNormal
capChange a paragraphEditingNormal
c$Change to end of lineEditingNormal
c0Change to start of lineEditingNormal
c^Change to first non-blank characterEditingNormal
sDelete character and enter insert modeEditingNormal
SDelete line and enter insert modeEditingNormal
r{char}Replace single characterEditingNormal
REnter replace modeEditingNormal
yyYank (copy) current lineEditingNormal
YYank from cursor to end of lineEditingNormal
y{motion}Yank text specified by motionEditingNormal
yiwYank inner wordEditingNormal
yawYank a wordEditingNormal
yipYank inner paragraphEditingNormal
yapYank a paragraphEditingNormal
pPaste after cursorEditingNormal
PPaste before cursorEditingNormal
]pPaste and adjust indentEditingNormal
[pPaste before and adjust indentEditingNormal
gpPaste after and move cursorEditingNormal
gPPaste before and move cursorEditingNormal
JJoin line belowEditingNormal
gJJoin line below without spaceEditingNormal
>>Indent lineEditingNormal
<<Unindent lineEditingNormal
==Auto-indent lineEditingNormal
>%Indent a blockEditingNormal
<%Unindent a blockEditingNormal
=%Auto-indent a blockEditingNormal
>ipIndent inner paragraphEditingNormal
Unindent inner paragraphEditingNormal
=ipAuto-indent inner paragraphEditingNormal
gu{motion}Make lowercaseEditingNormal
gU{motion}Make uppercaseEditingNormal
g~{motion}Toggle caseEditingNormal
guuLowercase lineEditingNormal
gUUUppercase lineEditingNormal
g~~Toggle case of lineEditingNormal
uUndoEditingNormal
UUndo all changes on lineEditingNormal
Ctrl+rRedoEditingNormal
.Repeat last changeEditingNormal
~Toggle case of characterEditingNormal
g&Repeat last substitute on all linesEditingNormal
gvReselect last visual selectionEditingNormal
gq{motion}Format text to textwidthEditingNormal
gwipFormat inner paragraphEditingNormal
gJJoin lines without spaceEditingNormal
g/pattern/dDelete lines matching patternEditingNormal
v/pattern/dDelete lines not matching patternEditingNormal
iEnter insert mode before cursorInsertNormal
IEnter insert mode at line startInsertNormal
aEnter insert mode after cursorInsertNormal
AEnter insert mode at line endInsertNormal
oOpen new line below and insertInsertNormal
OOpen new line above and insertInsertNormal
giInsert at last insert positionInsertNormal
gIInsert at column 1InsertNormal
Ctrl+hDelete character before cursorInsertInsert
Ctrl+wDelete word before cursorInsertInsert
Ctrl+uDelete all characters before cursor in lineInsertInsert
Ctrl+jBegin new lineInsertInsert
Ctrl+tIndent current lineInsertInsert
Ctrl+dUnindent current lineInsertInsert
Ctrl+nInsert next match of word before cursorInsertInsert
Ctrl+pInsert previous match of word before cursorInsertInsert
Ctrl+r {reg}Insert contents of registerInsertInsert
Ctrl+r =Insert result of expressionInsertInsert
Ctrl+r %Insert current filenameInsertInsert
Ctrl+r #Insert alternate filenameInsertInsert
Ctrl+r /Insert last search patternInsertInsert
Ctrl+r :Insert last command lineInsertInsert
Ctrl+r .Insert last inserted textInsertInsert
Ctrl+aInsert previously inserted textInsertInsert
Ctrl+@Insert previously inserted text and stop insertInsertInsert
Ctrl+oExecute one normal mode commandInsertInsert
Ctrl+v {char}Insert character literallyInsertInsert
Ctrl+v {number}Insert character by decimal valueInsertInsert
Ctrl+k {char1} {char2}Insert character by digraphInsertInsert
Ctrl+x Ctrl+lLine completionInsertInsert
Ctrl+x Ctrl+nKeyword completion from current fileInsertInsert
Ctrl+x Ctrl+kDictionary completionInsertInsert
Ctrl+x Ctrl+tThesaurus completionInsertInsert
Ctrl+x Ctrl+iKeyword completion from included filesInsertInsert
Ctrl+x Ctrl+]Tag completionInsertInsert
Ctrl+x Ctrl+fFile path completionInsertInsert
Ctrl+x Ctrl+dDefinition completionInsertInsert
Ctrl+x Ctrl+vVim command line completionInsertInsert
Ctrl+x Ctrl+uUser defined completionInsertInsert
Ctrl+x Ctrl+oOmni completionInsertInsert
Ctrl+x sSpelling suggestionsInsertInsert
Ctrl+x Ctrl+eScroll window upInsertInsert
Ctrl+x Ctrl+yScroll window downInsertInsert
Ctrl+eInsert character from belowInsertInsert
Ctrl+yInsert character from aboveInsertInsert
Shift+LeftMove cursor leftInsertInsert
Shift+RightMove cursor rightInsertInsert
Shift+UpMove cursor upInsertInsert
Shift+DownMove cursor downInsertInsert
HomeMove cursor to start of lineInsertInsert
EndMove cursor to end of lineInsertInsert
PageUpScroll window upInsertInsert
PageDownScroll window downInsertInsert
vEnter character-wise visual modeVisualNormal
VEnter line-wise visual modeVisualNormal
Ctrl+vEnter block-wise visual modeVisualNormal
gvReselect last visual selectionVisualNormal
oMove cursor to other end of selectionVisualVisual
OMove cursor to other corner of blockVisualVisual
awSelect a wordVisualVisual
iwSelect inner wordVisualVisual
aWSelect a WORDVisualVisual
iWSelect inner WORDVisualVisual
asSelect a sentenceVisualVisual
isSelect inner sentenceVisualVisual
apSelect a paragraphVisualVisual
ipSelect inner paragraphVisualVisual
abSelect a block (())VisualVisual
ibSelect inner block (())VisualVisual
aBSelect a block ({})VisualVisual
iBSelect inner block ({})VisualVisual
atSelect a tag block (<>)VisualVisual
itSelect inner tag block (<>)VisualVisual
a’Select a single quoted stringVisualVisual
i’Select inner single quoted stringVisualVisual
a”Select a double quoted stringVisualVisual
i”Select inner double quoted stringVisualVisual
a`Select a backtick stringVisualVisual
i`Select inner backtick stringVisualVisual
a]Select a [] blockVisualVisual
i]Select inner [] blockVisualVisual
a>Select a <> blockVisualVisual
i>Select inner <> blockVisualVisual
dDelete selectionVisualVisual
yYank selectionVisualVisual
cChange selectionVisualVisual
sSubstitute selectionVisualVisual
rReplace selection with characterVisualVisual
>Indent selectionVisualVisual
<Unindent selectionVisualVisual
=Auto-indent selectionVisualVisual
~Toggle case of selectionVisualVisual
uMake selection lowercaseVisualVisual
UMake selection uppercaseVisualVisual
JJoin selected linesVisualVisual
:Enter command line for selected linesVisualVisual
Ctrl+aIncrement number in selectionVisualVisual
Ctrl+xDecrement number in selectionVisualVisual
g Ctrl+aIncrement numbers in selectionVisualVisual
g Ctrl+xDecrement numbers in selectionVisualVisual
IInsert at start of visual blockVisualVisual Block
AAppend at end of visual blockVisualVisual Block
cChange visual blockVisualVisual Block
CChange till end of visual blockVisualVisual Block
$Extend block to end of linesVisualVisual Block
oMove to other corner of blockVisualVisual Block
OMove to other corner horizontallyVisualVisual Block
pPaste over visual selectionVisualVisual
PPaste before visual selectionVisualVisual
xDelete visual selectionVisualVisual
DDelete till end of visual selectionVisualVisual
YYank visual selectionVisualVisual
gqFormat selected textVisualVisual
gwFormat selected text and maintain cursorVisualVisual
g?ROT13 encode selectionVisualVisual
!Filter selection through external commandVisualVisual
:wWrite (save) fileFile OperationsCommand
:w filenameWrite to filenameFile OperationsCommand
:w!Force writeFile OperationsCommand
:qQuitFile OperationsCommand
:q!Force quitFile OperationsCommand
:wqWrite and quitFile OperationsCommand
😡Write if changed and quitFile OperationsCommand
:waWrite all buffersFile OperationsCommand
:qaQuit all buffersFile OperationsCommand
:wqaWrite and quit all buffersFile OperationsCommand
:e filenameEdit filenameFile OperationsCommand
:e!Reload current fileFile OperationsCommand
:e#Edit alternate fileFile OperationsCommand
:r filenameRead file into current bufferFile OperationsCommand
:r !commandRead command output into bufferFile OperationsCommand
:saveas filenameSave as filenameFile OperationsCommand
:f filenameRename current fileFile OperationsCommand
:bnNext bufferBufferCommand
:bpPrevious bufferBufferCommand
:bdDelete bufferBufferCommand
:buffersList all buffersBufferCommand
:ballLoad all buffersBufferCommand
:badd filenameAdd file to buffer listBufferCommand
:set optionSet optionSettingsCommand
:set option?Show option valueSettingsCommand
:set option&Reset option to defaultSettingsCommand
:setlocal optionSet option for current buffer/windowSettingsCommand
:map key commandMap key to commandMappingCommand
:nmap key commandMap key in normal modeMappingCommand
:vmap key commandMap key in visual modeMappingCommand
:imap key commandMap key in insert modeMappingCommand
:unmap keyRemove mappingMappingCommand
:marksShow all marksMarksCommand
:jumpsShow jump listNavigationCommand
:changesShow changes listHistoryCommand
:regShow registersRegistersCommand
:lsList buffersBufferCommand
:cd pathChange directoryFile OperationsCommand
:pwdPrint working directoryFile OperationsCommand
:!commandExecute shell commandShellCommand
:makeRun make commandBuildCommand
:copenOpen quickfix windowQuickfixCommand
:ccloseClose quickfix windowQuickfixCommand
:cnextNext quickfix itemQuickfixCommand
:cprevPrevious quickfix itemQuickfixCommand
:grep pattern filesGrep for patternSearchCommand
:vimgrep pattern filesVim internal grepSearchCommand
:%s/old/new/gReplace old with new globallySearch/ReplaceCommand
:%s/old/new/gcReplace with confirmationSearch/ReplaceCommand
:g/pattern/commandExecute command on matching linesGlobalCommand
:v/pattern/commandExecute command on non-matching linesGlobalCommand
:sortSort linesText ProcessingCommand
:retabConvert tabs to spacesText ProcessingCommand
:source fileSource vimscript fileScriptingCommand
:syntax on/offToggle syntax highlightingDisplayCommand
:highlightShow highlight groupsDisplayCommand
:filetype on/offToggle filetype detectionFiletypeCommand
:splitSplit window horizontallyWindowCommand
:vsplitSplit window verticallyWindowCommand
:newCreate new windowWindowCommand
:closeClose current windowWindowCommand
:onlyClose all windows except currentWindowCommand
:tabnewCreate new tabTabCommand
:tabcloseClose current tabTabCommand
:tabnextGo to next tabTabCommand
:tabpreviousGo to previous tabTabCommand
:undo numberGo to specific undo stateHistoryCommand
:earlier timeGo to earlier stateHistoryCommand
:later timeGo to later stateHistoryCommand
:hardcopyPrint documentFile OperationsCommand
:mksession fileSave session to fileSessionCommand
:source sessionLoad session from fileSessionCommand
Ctrl+w sSplit window horizontallyWindowNormal
Ctrl+w vSplit window verticallyWindowNormal
Ctrl+w nCreate new windowWindowNormal
Ctrl+w qQuit current windowWindowNormal
Ctrl+w cClose current windowWindowNormal
Ctrl+w oMake current window only oneWindowNormal
Ctrl+w jMove cursor to window belowWindowNormal
Ctrl+w kMove cursor to window aboveWindowNormal
Ctrl+w hMove cursor to window leftWindowNormal
Ctrl+w lMove cursor to window rightWindowNormal
Ctrl+w wMove cursor to next windowWindowNormal
Ctrl+w WMove cursor to previous windowWindowNormal
Ctrl+w pMove cursor to previous windowWindowNormal
Ctrl+w rRotate windows downwards/rightwardsWindowNormal
Ctrl+w RRotate windows upwards/leftwardsWindowNormal
Ctrl+w xExchange current window with nextWindowNormal
Ctrl+w =Make all windows equal sizeWindowNormal
Ctrl+w _Maximize window heightWindowNormal
Ctrl+wMaximize window widthWindow
Ctrl+w +Increase window heightWindowNormal
Ctrl+w –Decrease window heightWindowNormal
Ctrl+w >Increase window widthWindowNormal
Ctrl+w <Decrease window widthWindowNormal
Ctrl+w TMove window to new tabWindowNormal
Ctrl+w HMove window to far leftWindowNormal
Ctrl+w LMove window to far rightWindowNormal
Ctrl+w JMove window to bottomWindowNormal
Ctrl+w KMove window to topWindowNormal
:sb bufferSplit window and edit bufferBuffer/WindowCommand
:vert sb bufferVertically split window and edit bufferBuffer/WindowCommand
:buffersList all buffersBufferCommand
:lsList all buffersBufferCommand
:ballLoad all buffers in windowsBufferCommand
:vertical ballLoad all buffers in vertical windowsBufferCommand
:bnGo to next bufferBufferCommand
:bpGo to previous bufferBufferCommand
:bfGo to first bufferBufferCommand
:blGo to last bufferBufferCommand
:bdDelete current bufferBufferCommand
:bd!Force delete current bufferBufferCommand
:bwWipe out current bufferBufferCommand
:badd fileAdd file to buffer listBufferCommand
:bunloadUnload current bufferBufferCommand
:buffer numGo to buffer numBufferCommand
:buffer fileGo to buffer fileBufferCommand
:bdelete numDelete buffer numBufferCommand
:bdelete fileDelete buffer fileBufferCommand
:bufdo commandExecute command on all buffersBufferCommand
:tab sballOpen all buffers in tabsBuffer/TabCommand
:unhideOpen window for each loaded bufferBuffer/WindowCommand
:windo commandExecute command on all windowsWindowCommand
:wincmd commandExecute window commandWindowCommand
:resize nSet window height to nWindowCommand
:vertical resize nSet window width to nWindowCommand
:leftabove splitSplit window, new window aboveWindowCommand
:rightbelow splitSplit window, new window belowWindowCommand
:leftabove vsplitSplit window, new window leftWindowCommand
:rightbelow vsplitSplit window, new window rightWindowCommand
:eReload current fileFileCommand
:e filenameEdit filenameFileCommand
:e!Reload file, discard changesFileCommand
:enewCreate new empty bufferFileCommand
:find filenameFind and edit filenameFileCommand
:wWrite current fileFileCommand
:w filenameWrite to filenameFileCommand
:w!Force writeFileCommand
:w !sudo tee %Write with sudo permissionsFileCommand
:wnWrite and move to next fileFileCommand
:wNWrite and move to previous fileFileCommand
:waWrite all changed buffersFileCommand
:wa!Force write all buffersFileCommand
:saveas filenameSave file as filenameFileCommand
:updateWrite if buffer changedFileCommand
:write ++enc=encodingWrite with specific encodingFileCommand
:write ++ff=formatWrite with specific formatFileCommand
:write ++binWrite in binary modeFileCommand
:read filenameInsert file contentsFileCommand
:read !commandInsert command outputFileCommand
:edit +num fileOpen file at line numFileCommand
:edit +/pat fileOpen file at pattern patFileCommand
:edit #Edit alternate fileFileCommand
:browse eOpen file browserFileCommand
:cd pathChange working directoryFileCommand
:cd –Change to previous directoryFileCommand
:pwdPrint working directoryFileCommand
:fileShow current file infoFileCommand
:file nameSet filenameFileCommand
:filetypeDisplay filetypeFileCommand
:filetype on/offToggle filetype detectionFileCommand
gfGo to file under cursorFileNormal
gFGo to file under cursor (with line number)FileNormal
:oldfilesList recently edited filesFileCommand
:browse oldfilesBrowse recently edited filesFileCommand
:mksession fileSave session to fileFileCommand
:source fileLoad session from fileFileCommand
:mkviewSave view configurationFileCommand
:loadviewLoad view configurationFileCommand
:hardcopyPrint documentFileCommand
:TOhtmlConvert to HTMLFileCommand
:earlier timeRevert to earlier stateFileCommand
:later timeRevert to later stateFileCommand
:recoverRecover swap fileFileCommand
:preservePreserve swap fileFileCommand
:DiffOrigDiff with original fileFileCommand
ZZWrite if changed and quitFileNormal
ZQQuit without checking changesFileNormal
😡Write if changed and quitFileCommand
:exitSame as 😡FileCommand
:wqWrite and quitFileCommand
:xitSame as 😡FileCommand
:qQuitFileCommand
:q!Force quitFileCommand
:qaQuit allFileCommand
:qa!Force quit allFileCommand
:wqaWrite all and quitFileCommand
:xaSame as :wqaFileCommand
/patternSearch forward for patternSearchNormal
?patternSearch backward for patternSearchNormal
nRepeat search forwardSearchNormal
NRepeat search backwardSearchNormal
*Search forward for word under cursorSearchNormal
#Search backward for word under cursorSearchNormal
g*Search forward for partial word under cursorSearchNormal
g#Search backward for partial word under cursorSearchNormal
gdGo to local declarationSearchNormal
gDGo to global declarationSearchNormal
:%s/old/new/gReplace all occurrences in fileReplaceCommand
:%s/old/new/gcReplace all occurrences with confirmationReplaceCommand
:s/old/new/gReplace all occurrences in lineReplaceCommand
:s/old/new/gcReplace all occurrences in line with confirmationReplaceCommand
:{range}s/old/new/gReplace in rangeReplaceCommand
:g/pattern/s/old/new/gReplace in lines matching patternReplaceCommand
:v/pattern/s/old/new/gReplace in lines not matching patternReplaceCommand
:&&Repeat last substituteReplaceCommand
:~Repeat last substitute with last search patternReplaceCommand
:g/patternList lines matching patternSearchCommand
:v/patternList lines not matching patternSearchCommand
:vimgrep pattern filesSearch in multiple filesSearchCommand
:grep pattern filesExternal grep searchSearchCommand
:lgrep pattern filesExternal grep search (location list)SearchCommand
:copenOpen quickfix windowSearchCommand
:lopenOpen location list windowSearchCommand
:cnextNext quickfix itemSearchCommand
:cprevPrevious quickfix itemSearchCommand
:cfirstFirst quickfix itemSearchCommand
:clastLast quickfix itemSearchCommand
:lnextNext location list itemSearchCommand
:lprevPrevious location list itemSearchCommand
:lfirstFirst location list itemSearchCommand
:llastLast location list itemSearchCommand
:cdo commandExecute command on each quickfix itemSearchCommand
:ldo commandExecute command on each location list itemSearchCommand
:nohClear search highlightingSearchCommand
:set hlsearchEnable search highlightingSearchCommand
:set nohlsearchDisable search highlightingSearchCommand
:set incsearchEnable incremental searchSearchCommand
:set noincsearchDisable incremental searchSearchCommand
:set ignorecaseEnable case-insensitive searchSearchCommand
:set noignorecaseDisable case-insensitive searchSearchCommand
:set smartcaseEnable smart case searchSearchCommand
:set nosmartcaseDisable smart case searchSearchCommand
gnSelect next search matchSearchNormal
gNSelect previous search matchSearchNormal
:promptfindOpen GUI find dialogSearchCommand
:promptreplOpen GUI replace dialogSearchCommand
m{a-zA-Z}Set mark {a-zA-Z} at cursor positionMarksNormal
‘{a-zA-Z}Jump to line of mark {a-zA-Z}MarksNormal
`{a-zA-Z}Jump to position of mark {a-zA-Z}MarksNormal
:marksList all marksMarksCommand
:delmarks {marks}Delete specified marksMarksCommand
:delmarks!Delete all marks for current bufferMarksCommand
Jump to last jump positionMarksNormal
Jump to exact last jump positionMarksNormal
‘.Jump to position of last changeMarksNormal
`.Jump to exact position of last changeMarksNormal
‘[Jump to start of last changed/yanked textMarksNormal
‘]Jump to end of last changed/yanked textMarksNormal
‘<Jump to start of last visual selectionMarksNormal
‘>Jump to end of last visual selectionMarksNormal
‘0Jump to position where Vim was last exitedMarksNormal
‘1-‘9Jump to positions of last 9 files exitedMarksNormal
“{a-z}Use register {a-z} for next delete/yank/putRegistersNormal
“{A-Z}Append to register {a-z}RegistersNormal
“”Unnamed register (last delete/yank)RegistersNormal
“0Yank registerRegistersNormal
“1-“9Delete registers (historical)RegistersNormal
“:Last command registerRegistersNormal
“.Last inserted text registerRegistersNormal
“%Current filename registerRegistersNormal
“#Alternate filename registerRegistersNormal
“/Last search pattern registerRegistersNormal
“=Expression registerRegistersNormal
“*System clipboard register (X11 primary)RegistersNormal
“+System clipboard register (X11 clipboard)RegistersNormal
“_Black hole registerRegistersNormal
:regDisplay contents of all registersRegistersCommand
:reg {arg}Display contents of specified registersRegistersCommand
Ctrl+r {reg}Insert contents of register in insert modeRegistersInsert
@{reg}Execute contents of register as macroRegistersNormal
“xy{motion}Yank {motion} text into register xRegistersNormal
“xpPut contents of register x after cursorRegistersNormal
“xPPut contents of register x before cursorRegistersNormal
:let @x = “string”Set register x to “string”RegistersCommand
:let @x .= “string”Append “string” to register xRegistersCommand
:let @/ = “pattern”Set search patternRegistersCommand
:let @” = “string”Set unnamed registerRegistersCommand
:let @* = “string”Set system clipboardRegistersCommand
:let @+ = “string”Set system clipboard (X11)RegistersCommand
“%Name of current fileRegistersNormal
“#Name of alternate fileRegistersNormal
“.Last inserted textRegistersNormal
“:Last command-lineRegistersNormal
“/Last search patternRegistersNormal
“=Result of expressionRegistersNormal
“*GUI selectionRegistersNormal
“+GUI clipboardRegistersNormal
“~Drop registerRegistersNormal
“_Black holeRegistersNormal
awA wordText ObjectNormal/Visual
iwInner wordText ObjectNormal/Visual
aWA WORDText ObjectNormal/Visual
iWInner WORDText ObjectNormal/Visual
asA sentenceText ObjectNormal/Visual
isInner sentenceText ObjectNormal/Visual
apA paragraphText ObjectNormal/Visual
ipInner paragraphText ObjectNormal/Visual
a] or a[A [] blockText ObjectNormal/Visual
i] or i[Inner [] blockText ObjectNormal/Visual
a) or abA () blockText ObjectNormal/Visual
i) or ibInner () blockText ObjectNormal/Visual
a> or a<A <> blockText ObjectNormal/Visual
i> or i<Inner <> blockText ObjectNormal/Visual
a} or aBA {} blockText ObjectNormal/Visual
i} or iBInner {} blockText ObjectNormal/Visual
atA tag blockText ObjectNormal/Visual
itInner tag blockText ObjectNormal/Visual
a”A double quoted stringText ObjectNormal/Visual
i”Inner double quoted stringText ObjectNormal/Visual
a’A single quoted stringText ObjectNormal/Visual
i’Inner single quoted stringText ObjectNormal/Visual
a`A backtick stringText ObjectNormal/Visual
i`Inner backtick stringText ObjectNormal/Visual
d{motion}Delete text specified by {motion}OperatorNormal
c{motion}Change text specified by {motion}OperatorNormal
y{motion}Yank text specified by {motion}OperatorNormal
>{motion}Indent text specified by {motion}OperatorNormal
<{motion}Unindent text specified by {motion}OperatorNormal
={motion}Auto-indent text specified by {motion}OperatorNormal
g~{motion}Toggle case of text specified by {motion}OperatorNormal
gu{motion}Make text specified by {motion} lowercaseOperatorNormal
gU{motion}Make text specified by {motion} uppercaseOperatorNormal
!{motion}Filter text through external commandOperatorNormal
gq{motion}Format text specified by {motion}OperatorNormal
gw{motion}Format text specified by {motion} and keep cursorOperatorNormal
g?{motion}ROT13 encode text specified by {motion}OperatorNormal
zf{motion}Create fold for text specified by {motion}OperatorNormal
g@{motion}Call function set by ‘operatorfunc’OperatorNormal
diwDelete inner wordOperationNormal
ciwChange inner wordOperationNormal
yiwYank inner wordOperationNormal
dawDelete a wordOperationNormal
cawChange a wordOperationNormal
yawYank a wordOperationNormal
di(Delete inside parenthesesOperationNormal
ci(Change inside parenthesesOperationNormal
yi(Yank inside parenthesesOperationNormal
da(Delete around parenthesesOperationNormal
ca(Change around parenthesesOperationNormal
ya(Yank around parenthesesOperationNormal
ditDelete inside tagOperationNormal
citChange inside tagOperationNormal
yitYank inside tagOperationNormal
datDelete around tagOperationNormal
catChange around tagOperationNormal
yatYank around tagOperationNormal
q{a-z}Start recording macro into register {a-z}MacroNormal
qStop recording macroMacroNormal
@{a-z}Execute macro in register {a-z}MacroNormal
@@Execute last executed macroMacroNormal
{count}@{a-z}Execute macro {count} timesMacroNormal
:reg {a-z}Show contents of macro registerMacroCommand
“apPaste contents of macro register to editMacroNormal
“{a-z}yyYank current line into macro registerMacroNormal
:let @a=”Clear macro register aMacroCommand
:let @a.=’commands’Append to macro register aMacroCommand
qaStart recording into register aMacroNormal
qEnd recordingMacroNormal
:normal @aExecute macro on each line in rangeMacroCommand
:argdo normal @aExecute macro on each file in argument listMacroCommand
:bufdo normal @aExecute macro on each bufferMacroCommand
:windo normal @aExecute macro on each windowMacroCommand
:tabdo normal @aExecute macro on each tabMacroCommand
:global/pattern/normal @aExecute macro on matching linesMacroCommand
“apPaste macro contentsMacroNormal
“{reg}yyYank line into registerMacroNormal
:let @a=@bCopy macro from register b to aMacroCommand
:let @a=@a[1:]Remove first character of macroMacroCommand
:let @a=@a[:-2]Remove last character of macroMacroCommand
:breakBreak out of macro executionMacroCommand
:continueContinue macro executionMacroCommand
:returnReturn from macro executionMacroCommand
:silent normal @aExecute macro silentlyMacroCommand
:verbose normal @aExecute macro verboselyMacroCommand
:while conditionStart while loop in macroMacroCommand
:endwhileEnd while loop in macroMacroCommand
:if conditionStart if condition in macroMacroCommand
:endifEnd if condition in macroMacroCommand
:for item in listStart for loop in macroMacroCommand
:endforEnd for loop in macroMacroCommand
zf{motion}Create foldFoldingNormal
zFCreate fold for [count] linesFoldingNormal
:{range}fo[ld]Create fold for rangeFoldingCommand
zdDelete fold at cursorFoldingNormal
zDDelete fold at cursor recursivelyFoldingNormal
zEEliminate all foldsFoldingNormal
zoOpen fold under cursorFoldingNormal
zOOpen fold under cursor recursivelyFoldingNormal
zcClose fold under cursorFoldingNormal
zCClose fold under cursor recursivelyFoldingNormal
zaToggle fold under cursorFoldingNormal
zAToggle fold under cursor recursivelyFoldingNormal
zvView cursor line (open folds)FoldingNormal
zxUpdate folds and open cursor foldFoldingNormal
zXUpdate foldsFoldingNormal
zmFold more (reduce foldlevel)FoldingNormal
zMClose all foldsFoldingNormal
zrFold less (increase foldlevel)FoldingNormal
zROpen all foldsFoldingNormal
ziToggle foldingFoldingNormal
[zMove to start of current foldFoldingNormal
]zMove to end of current foldFoldingNormal
zjMove downwards to start of next foldFoldingNormal
zkMove upwards to end of previous foldFoldingNormal
znDisable foldingFoldingNormal
zNEnable foldingFoldingNormal
:set foldmethod=manualSet manual foldingFoldingCommand
:set foldmethod=indentSet indent foldingFoldingCommand
:set foldmethod=markerSet marker foldingFoldingCommand
:set foldmethod=syntaxSet syntax foldingFoldingCommand
:set foldmethod=exprSet expression foldingFoldingCommand
:set foldmethod=diffSet diff foldingFoldingCommand
:set foldlevel=nSet fold level to nFoldingCommand
:set foldcolumn=nShow fold column of width nFoldingCommand
:set foldminlines=nMinimum lines for a foldFoldingCommand
:set foldnestmax=nMaximum fold nestingFoldingCommand
:set foldtext=stringSet text displayed for closed foldsFoldingCommand
:set foldmarker=str,strSet fold markersFoldingCommand
:set foldignore=charSet chars to ignore in indent foldingFoldingCommand
:set foldenableEnable foldingFoldingCommand
:set nofoldenableDisable foldingFoldingCommand
zjMove downwards to next foldFoldingNormal
zkMove upwards to previous foldFoldingNormal
[zMove to start of current open foldFoldingNormal
]zMove to end of current open foldFoldingNormal
:foldCreate fold for current lineFoldingCommand
:foldcloseClose foldFoldingCommand
:foldopenOpen foldFoldingCommand
:diffsplit {filename}Split window and show diffDiffCommand
:vert diffsplit {filename}Vertical split and show diffDiffCommand
:diffpatch {patchfile}Apply patch and show diffDiffCommand
:diffthisMake current window part of diffDiffCommand
:diffoffTurn off diff modeDiffCommand
:diffoff!Turn off diff mode in all windowsDiffCommand
:diffupdateUpdate diff colorsDiffCommand
doDiff obtain (get change from other window)DiffNormal
dpDiff put (put change to other window)DiffNormal
]cJump to next changeDiffNormal
[cJump to previous changeDiffNormal
:diffgetGet changes from other windowDiffCommand
:diffputPut changes to other windowDiffCommand
:diffget //2Get changes from file 2 in 3-way diffDiffCommand
:diffget //3Get changes from file 3 in 3-way diffDiffCommand
:set diffopt+=iwhiteIgnore whitespace in diffDiffCommand
:set diffopt+=horizontalHorizontal diff splitDiffCommand
:set diffopt+=verticalVertical diff splitDiffCommand
:set diffopt+=fillerShow filler linesDiffCommand
:set diffopt+=context:nSet context linesDiffCommand
:set diffexpr=MyDiff()Set custom diff expressionDiffCommand
vimdiff file1 file2Start vim in diff modeDiffShell
:windo diffthisDiff all windowsDiffCommand
:diffsShow diff statsDiffCommand
:diffoTurn off diff modeDiffCommand
:set noscrollbindDisable scroll bindingDiffCommand
:set scrollbindEnable scroll bindingDiffCommand
:set cursorbindEnable cursor bindingDiffCommand
:set nocursorbindDisable cursor bindingDiffCommand
:set diffopt+=icaseIgnore case differencesDiffCommand
:set diffopt+=iwhiteIgnore whitespace changesDiffCommand
:set diffopt+=iwhiteallIgnore all whitespaceDiffCommand
:set diffopt+=iwhiteeolIgnore whitespace at EOLDiffCommand
:set diffopt+=fillerShow filler linesDiffCommand
:set diffopt+=context:3Set context lines to 3DiffCommand
:set diffopt+=horizontalPrefer horizontal splitsDiffCommand
:set diffopt+=verticalPrefer vertical splitsDiffCommand
:set diffopt+=internalUse internal diffDiffCommand
:set diffopt+=algorithm:patienceUse patience diff algorithmDiffCommand
:set diffopt+=indent-heuristicUse indent heuristicDiffCommand
]cNext differenceDiffNormal
[cPrevious differenceDiffNormal
:1,$+1diffgetGet all changes from other windowDiffCommand
:1,$+1diffputPut all changes to other windowDiffCommand
Ctrl+]Jump to tag under cursorTagsNormal
Ctrl+tJump back from tagTagsNormal
:tag {tag}Jump to tagTagsCommand
:tagsShow tag stackTagsCommand
:tselect {tag}Select from multiple tagsTagsCommand
:tjump {tag}Jump to tag or select if multipleTagsCommand
:tnextJump to next matching tagTagsCommand
:tprevJump to previous matching tagTagsCommand
:tfirstJump to first matching tagTagsCommand
:tlastJump to last matching tagTagsCommand
g]Show all tags under cursorTagsNormal
:ptag {tag}Preview tagTagsCommand
:pcloseClose preview windowTagsCommand
:ptjump {tag}Preview tag and jumpTagsCommand
Ctrl+nNext completionCompletionInsert
Ctrl+pPrevious completionCompletionInsert
Ctrl+x Ctrl+nKeywords in current fileCompletionInsert
Ctrl+x Ctrl+iKeywords in included filesCompletionInsert
Ctrl+x Ctrl+]Tags completionCompletionInsert
Ctrl+x Ctrl+kDictionary completionCompletionInsert
Ctrl+x Ctrl+lWhole line completionCompletionInsert
Ctrl+x Ctrl+fFile path completionCompletionInsert
Ctrl+x Ctrl+oOmni completionCompletionInsert
Ctrl+x Ctrl+vCommand line completionCompletionInsert
Ctrl+x Ctrl+uUser defined completionCompletionInsert
Ctrl+x Ctrl+sSpelling suggestionsCompletionInsert
Ctrl+x sSpelling suggestionsCompletionInsert
:set spellEnable spell checkingSpellCommand
:set nospellDisable spell checkingSpellCommand
:set spelllang=en_usSet spelling languageSpellCommand
]sNext misspelled wordSpellNormal
[sPrevious misspelled wordSpellNormal
z=Suggest correctionsSpellNormal
zgAdd word to spell fileSpellNormal
zwMark word as wrongSpellNormal
zugUndo zg or zwSpellNormal
:spellrRepeat last z=SpellCommand
:spelldumpCreate spell fileSpellCommand
:spellinfoShow spell file infoSpellCommand
==Format current lineFormatNormal
=%Format code blockFormatNormal
gg=GFormat entire fileFormatNormal
:retabConvert tabs to spacesFormatCommand
:set expandtabUse spaces instead of tabsFormatCommand
:set noexpandtabUse tabsFormatCommand
:set shiftwidth=nSet indentation widthFormatCommand
:set tabstop=nSet tab widthFormatCommand
gq{motion}Format text to textwidthFormatNormal
gw{motion}Format text and keep cursorFormatNormal
:leftLeft align textFormatCommand
:centerCenter align textFormatCommand
:rightRight align textFormatCommand
gREnter Replace modeSpecialNormal
ghEnter Select modeSpecialNormal
gHEnter Line Select modeSpecialNormal
Ctrl+vEnter Visual Block modeSpecialNormal
QEnter Ex modeSpecialNormal
gQEnter Ex modeSpecialNormal
:terminalEnter Terminal modeSpecialCommand
:help {plugin-name}Show plugin helpPluginCommand
:scriptnamesList all loaded scriptsPluginCommand
:packadd {plugin}Load optional pluginPluginCommand
:packloadallLoad all pluginsPluginCommand
:runtime {file}Source runtime filesPluginCommand
:ExploreOpen file explorerNetrwCommand
:SexploreSplit and exploreNetrwCommand
:VexploreVertical split and exploreNetrwCommand
:TexploreTab exploreNetrwCommand
:LexploreLeft explorer toggleNetrwCommand
%Create new fileNetrwNormal
dCreate new directoryNetrwNormal
DDelete file/directoryNetrwNormal
RRename file/directoryNetrwNormal
POpen in previous windowNetrwNormal
iCycle view modeNetrwNormal
ghToggle hidden filesNetrwNormal
mfMark fileNetrwNormal
mrMark files using regexNetrwNormal
mtCurrent target directoryNetrwNormal
mmMove marked filesNetrwNormal
mcCopy marked filesNetrwNormal
%Jump between matching pairsMatchitNormal
g%Jump backwards between matchesMatchitNormal
[%Jump to previous unmatched groupMatchitNormal
]%Jump to next unmatched groupMatchitNormal
a%Select between matching pairsMatchitVisual
:Man {topic}View man pageManCommand
KView man page for word under cursorManNormal
\KView custom keywordprg for wordManNormal
:makeRun make commandCompilerCommand
:compiler {name}Set compilerCompilerCommand
:copenOpen quickfix windowCompilerCommand
:ccloseClose quickfix windowCompilerCommand
:cnextNext errorCompilerCommand
:cpreviousPrevious errorCompilerCommand
:cfirstFirst errorCompilerCommand
:clastLast errorCompilerCommand
:terminalOpen terminal windowTerminalCommand
Ctrl+w NTerminal Normal modeTerminalTerminal
i or aReturn to Terminal modeTerminalTerminal-Normal
:term {cmd}Run command in terminalTerminalCommand
Ctrl+\ Ctrl+nEnter Terminal-Normal modeTerminalTerminal
:TOhtmlConvert to HTMLPluginCommand
:RefreshGuiFontRefresh GUI fontPluginCommand
:LoadProfilesLoad color profilesPluginCommand
:SaveProfilesSave color profilesPluginCommand
:DoMatchParenEnable match parenthesesPluginCommand
:NoMatchParenDisable match parenthesesPluginCommand
:helptags ALLGenerate help tagsPluginCommand
:runtime! plugin/**/*.vimLoad all pluginsPluginCommand
:verbose scriptnamesList scripts with sourcePluginCommand
:finishStop sourcing scriptPluginCommand
:profile start {file}Start profilingPluginCommand
:profile func *Profile all functionsPluginCommand
:profile file *Profile all filesPluginCommand

Basic Vim Commands

Let’s start with an easy set of Vim commands to open, save, and exit Vim.

:e filenameOpen filename for edition
:wSave file
:qExit Vim
:q!Quit without saving
😡Write file (if changes has been made) and exit
:sav filenameSaves file as filename
.Repeats the last change made in normal mode

Moving in the File

While in command mode, the following set of commands will allow you to easily move the cursor in the file, jump to a particular line number, or set the cursor position at the beginning of the file.

k or Up Arrowmove the cursor position up one line
j or Down Arrowmove the cursor down one line
emove the cursor to the end of the word
bmove the cursor to the begining of the word
0move the cursor to the begining of the line
Gmove the cursor to the end of the file
ggmove the cursor to the begining of the file
Lmove the cursor to the bottom of the screen
:59move cursor to line number 59. Replace 59 by the desired line number.
%Move cursor to matching parenthesis
[[Jump to function start
[{Jump to block start

Cut, Copy & Paste

Here are some basic Vim commands to cut, copy and paste portions of text. All the commands below has to be ran in command mode.

yCopy the selected text to clipboard
pPaste clipboard contents
ddCut current line
yyCopy current line
y$Copy to end of line
DCut to end of line

In command mode, you can easily search for any string within a file. This is extremely useful for developers and sysadmins alike.

/wordSearch word from top to bottom
?wordSearch word from bottom to top
*Search the word under cursor
/cstringSearch STRING or string, case insensitive
/jo[ha]nSearch john or joan
/< theSearch the, theatre or then
/the>Search the or breathe
/fred|joeSearch fred or joe
/<dddd>Search exactly 4 digits
/^n{3}Find 3 empty lines
:bufdo /searchstr/Search in all open files
bufdo %s/something/somethingelse/gSearch something in all the open buffers and replace it with somethingelse

Replace

Vim command line tool is extremely useful to replace many occurences of a string by another within a file. Using more advanced commands, there are a lot of search and replace options available.

:%s/old/new/gReplace all occurences of old by new in file
:%s/onward/forward/giReplace onward by forward, case unsensitive
:%s/old/new/gcReplace all occurences with confirmation
:%s/^/hello/gReplace the begining of each line by hello
:%s/$/Harry/gReplace the end of each line by Harry
:%s/onward/forward/giReplace onward by forward, case unsensitive
:%s/ *$//gDelete all white spaces
:g/string/dDelete all lines containing string
:v/string/dDelete all lines containing which didn’t contain string
:s/Bill/Steve/Replace the first occurence of Bill by Steve in current line
:s/Bill/Steve/gReplace Bill by Steve in current line
:%s/Bill/Steve/gReplace Bill by Steve in all the file
:%s/^M//gDelete DOS carriage returns (^M)
:%s/r/r/gTransform DOS carriage returns in returns
:%s#<[^>]+>##gDelete HTML tags but keeps text
:%s/^(.*)n1$/1/Delete lines which appears twice
Ctrl+aIncrement number under the cursor
Ctrl+xDecrement number under cursor
ggVGg?Change text to Rot13

Case

Vim has some powerful commands to modify the case of text. All the commands below have to be run in command mode.

VuLowercase line
VUUppercase line
g~~Invert case
vEUSwitch word to uppercase
vE~Modify word case
ggguGSet all text to lowercase
gggUGSet all text to uppercase
:set ignorecaseIgnore case in searches
:set smartcaseIgnore case in searches excepted if an uppercase letter is used
:%s/<./u&/gSets first letter of each word to uppercase
:%s/<./l&/gSets first letter of each word to lowercase
:%s/.*/u&Sets first letter of each line to uppercase
:%s/.*/l&Sets first letter of each line to lowercase

Read and Write Files

Vim is clearly one of the most powerful text editors available. This section shows how you can manipulate files, insert the content of a file into another, and export portions of a file into a new file.

:1,10 w outfileSaves lines 1 to 10 in outfile
:1,10 w >> outfileAppends lines 1 to 10 to outfile
:r infileInsert the content of infile
:23r infileInsert the content of infile under line 23

File Explorer

Vim features a built in file explorer, which allows you to explorer the content of your server without exiting the text editor.

:e .Open integrated file explorer
:SexSplit window and open integrated file explorer
:Sex!Same as :Sex but split window vertically
:browse eGraphical file explorer
:lsList buffers
:cd ..Move to parent directory
:argsList files
:args *.phpOpen file list
:grep expression *.phpReturns a list of .php files contening expression
gfOpen file name under cursor

Interact With Unix

Vim is installed by default on most Unix based operating systems, including Mac OS and most GNU/Linux distros. It therefore feature various commands that allows you to interact with the OS.

:!pwdExecute the pwd unix command, then returns to Vi
!!pwdExecute the pwd unix command and insert output in file
:shTemporary returns to Unix
$exitRetourns to Vi

Alignment

In command mode, you can quickly and easily align a file’s lines for better clarity.

:%!fmtAlign all lines
!}fmtAlign all lines at the current position
5!!fmtAlign the next 5 lines

Tabs and Windows

One of my favorite Vim options is the ability to use tabs to edit various files at the same time. The following Vim commands will let you open, close, and organize your tabs for better productivity.

:tabnewCreates a new tab
gtShow next tab
:tabfirstShow first tab
:tablastShow last tab
:tabm n(position)Rearrange tabs
:tabdo %s/foo/bar/gExecute a command in all tabs
:tab ballPuts all open files in tabs
:new abc.txtEdit abc.txt in new window

Window Spliting

Vim allows you to split the screen horizontally or vertically, so you can edit many files at once using the insert mode.

:e filenameEdit filename in current window
:split filenameSplit the window and open filename
ctrl-w up arrowPuts cursor in top window
ctrl-w ctrl-wPuts cursor in next window
ctrl-w_Maximize current window vertically
ctrl-w|Maximize current window horizontally
ctrl-w=Gives the same size to all windows
10 ctrl-w+Add 10 lines to current window
:vsplit fileSplit window vertically
:sview fileSame as :split in readonly mode
:hideClose current window
:­nlyClose all windows, excepted current
:b 2Open #2 in this window

Auto-Completion

Vim can use external dictionaries to provide auto-completion. This can be a real time saver, so pay attention to the commands below if you want to speed up your workflow.

Ctrl+n Ctrl+p (To be used in insert mode)Complete word
Ctrl+x Ctrl+lComplete line
:set dictionary=dictDefine dict as a dictionnary
Ctrl+x Ctrl+kComplete with dictionnary

Marks

When editing large files, it can be tricky to move in the file and remember important sections. Happily, Vim allows its users to create marks that can easily be accessed later. No need to remember a dozen of line numbers anymore!

m {a-z}Marks current position as {a-z}
‘ {a-z}Move to position {a-z}
Move to previous position

Abbreviations

This little known trick lets you define abbreviations that can be reused later and as many times as needed.

:ab mail mail@provider.orgDefine mail as abbreviation of mail@provider.org

Text Indentation

Text indentation is vital when it comes to code readability. Luckily, Vim has a set of commands for the text editor to indent your lines in a clear and readable manner.

:set autoindentTurn on auto-indent
:set smartindentTurn on intelligent auto-indent
:set shiftwidth=4Defines 4 spaces as indent size
ctrl-t, ctrl-dIndent/un-indent in insert mode
>>Indent
<<Un-indent
=%Indent the code between parenthesis
1GVG=Indent the whole file

Frequently Asked Questions (FAQ)

Vim basic commands

How do I Type Commands in Vim?

To type commands, you have to first activate Vim’s command mode. To do so, press the Esc key of your keyboard. You can then type any command of your choice.

How do I Start Typing Text in Vim?

Vim must be in insert mode for you to type text. Simply press the i key when in command mode to enter the insert mode.

On Which Hosting Plans Can You Use Vim?

Basically any Linux hosting will have Vim installed on the server. As long as you are able to access your server via SSH, you’ll be able to use Vim. Please refer to our best web hosting for developers guide to find out which hosts provide a SSH access.

Jean-Baptiste Jung is a self-taught web developer, web designer, and influential blogger from Belgium who has made significant contributions to the WordPress community since 2006. As the founder of CatsWhoCode (established in 2008) and WPRecipes, he has helped countless developers through his tutorials and technical guides. Jung is also a published author of the WordPress 2.7 Cookbook and a regular contributor to prestigious publications like Smashing Magazine. Known for prioritizing quality over quantity in his work, he advocates for passion in web development and believes in making technical knowledge accessible to others. His expertise spans multiple programming languages, with a focus on PHP, WordPress, HTML/CSS, and JavaScript development.

«
»

Leave a Reply

Your email address will not be published. Required fields are marked *