Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

hakluke/how-to-exit-vim

Below are some simple methods for exiting vim.

hakluke/how-to-exit-vim.json
{
"createdAt": "2019-09-25T13:36:25Z",
"defaultBranch": "master",
"description": "Below are some simple methods for exiting vim.",
"fullName": "hakluke/how-to-exit-vim",
"homepage": "https://hakluke.com",
"language": null,
"name": "how-to-exit-vim",
"pushedAt": "2024-06-13T12:41:55Z",
"stargazersCount": 7142,
"topics": [
"vim"
],
"updatedAt": "2025-11-25T06:48:56Z",
"url": "https://github.com/hakluke/how-to-exit-vim"
}

Below are some simple methods for exiting vim.

For real vim (and hacking) tips, follow hakluke and tomnomnom on twitter.

Credit: @tomnomnom

:!ps axuw | grep vim | grep -v grep | awk '{print $2}' | xargs kill -9

tomnomnom

Credit: @tomnomnom

:!kill -9 $(find /proc -name "cmdline" 2>/dev/null | while read procfile; do if grep -Pa '^vim\x00' "$procfile" &>/dev/null; then echo $procfile; fi; done | awk -F'/' '{print $3}' | sort -u)

Credit: @hakluke

:!find /proc -name status | while read file; do echo "$file: "; cat $file | grep vim; done | grep -B1 vim | grep -v Name | while read line; do sed 's/^\/proc\///g' | sed 's/\/.*//g'; done | xargs kill -9

Credit: @kpumuk

:!grep -P "PPid:\t(\d+)" /proc/$$/status | cut -f2 | xargs kill -9

Credit: @caseyjohnellis ![Jeffrey Way]!(assets/first-contact-way.png)

Credit: @PozziSan

Terminal window
python -c "from os import system; system('killall -9 vim')"

Credit: @hakluke

:py3 import os,signal;from subprocess import check_output;os.kill(int(check_output(["pidof","vim"]).decode
('utf-8')),signal.SIGTERM)
:!perl -e 'while(</proc/*>){open($f, "$_/cmdline"); kill 9, substr($_,6) if <$f> =~ m|^vim\x00| }'

Credit: @wodny

  1. Reimplement vim in Rust.
  2. Call the project rim.
  3. Run rim.
  4. Exit rim using a borrowed command, ie. :q!.

Credit: @rynaro

Terminal window
$ ruby -e 'system("killall -9 vim")'

Credit: @rynaro

Terminal window
$ ruby -e 'pid = `pidof vim`; Process.kill(9, pid.to_i)'

Credit: @w181496

In insert mode:

<C-R>=system("ps axuw | grep vim | grep -v grep | awk '{print $2}' | xargs kill -9")

Credit: @eur0pa

In vi:

:%!( key="kill-vi-$RANDOM"; nc -l 8888 | if grep $key; then pgrep '^vi$' | xargs kill; fi; ) &

Remotely:

Terminal window
$ while true; do curl http://vi-host:8888/kill-vi-$RANDOM; done

vi will eventually exit

Locally (the cheaty, lazy way, why even bother):

Terminal window
$ curl "http://localhost:8888/$(ps aux | grep -E -o 'kill-vi-[0-9]+')"

Credit: @Jorengarenar

Pull the plug out

Use VIMKiller! The most practical physical solution to all your VIM troubles. It only costs 500,000 USD!

VIMKiller git

Credit: @aarongorka

Before running vim, make sure to set a timeout:

Terminal window
$ timeout 600 vim

Never forget to set a timeout again:

Terminal window
$ alias vim='timeout 600 vim'

Make sure to save regularly.

When you want to spice things up a bit:

Terminal window
$ timeout $RANDOM vim

Credit: @aliva

Terminal window
$ ps axuw | awk '{print $2}' | grep -v PID | shuf -n 1 | sudo kill -9

The “all against the odds” Russian Roulette way

Section titled “The “all against the odds” Russian Roulette way”

Credit: @cfrost

When you want to spice things up a bit more:

:!ps axuw | sort -R | head -1 | awk '{print $2}' | xargs kill -9

Credit: @eyemyth

Accumulate a sufficient amount of entropy.

Credit: @tctovsli In vi:

:!sudo reboot

The using vim against itself way (executing the buffer)

Section titled “The using vim against itself way (executing the buffer)”

Open Vim to empty buffer and type:

i:qa!<esc>Y:@"<cr>

Credit: @dbalatero In Mac terminal vi:

Replace “iTerm” with your terminal application of choice:

:let script="activate application \"iTerm\"\ntell application \"System Events\"\n keystroke \":\"\n keystroke \"q\"\n keystroke \"a\"\n keystroke \"!\"\n key code 36\nend tell" | call writefile(split(script, "\n", 1), '/tmp/exit-vim.scpt', 'b') | !osascript /tmp/exit-vim.scpt

Credit: @dbalatero

let script="activate application \"Activity Monitor\"\ntell application \"System Events\"\n\tkeystroke \"f\" using {option down, command down}\n\tkeystroke \"vim\"\n\n\ttell process \"Activity Monitor\"\n\t\ttell outline 1 of scroll area 1 of window 1\n\t\t\tselect row 1\n\n\t\t\tkeystroke \"q\" using {option down, command down}\n\t\t\tkey code 36\n\t\tend tell\n\tend tell\nend tell\n" | call writefile(split(script, "\n", 1), '/tmp/exit-vim.scpt', 'b') | !osascript /tmp/exit-vim.scpt

Credit: @IA_Baby46

Touch quit vim text in your touch bar

Press +q > Click Terminate

Walk away.

Terminal window
!bash -c "💣(){ 💣|💣& };💣"

…then walk away. (n.b. That’s a fork bomb, please don’t try at home.)

Credit: @cheezmeister

Terminal window
!powershell.exe /c "get-process gvim | stop-process"

Credit: @dbalatero

:let script=['#define _POSIX_SOURCE', '#include <signal.h>', '', "int main() {", " kill(" . getpid() . ", SIGKILL);", ' return 0;', '}'] | call writefile(script, '/tmp/exit_vim.c', 'b') | execute "!gcc /tmp/exit_vim.c -o /tmp/exit_vim" | execute "! /tmp/exit_vim"

Credit: @dbalatero

:let command='emacs --batch --eval=''(shell-command "kill -9 ' . getpid() . '")'' --kill' | execute "!" . command

Credit: @david50407

:let command='vim ''+\\!kill -9 ' . getpid() . ''' +qall -es' | execute "!" . command

Credit: @tartansandal

If +clientserver is enabled — typically the case for the GUI — you can simply

:!gvim --remote-send ':q\!<CR>'

Credit: @ryanc

Don’t run this, it could break your computer.

Terminal window
:!echo b | sudo tee -a /proc/sysrq-trigger

Credit: @mashuptwice

:!python -c "import os ; os.system(\"ssh localhost kill -9 $(pgrep vim >tmpfile && grep -P '\d+' tmpfile | sed 's/\(.*\)/\1/g' | cat && rm tmpfile) \")"

Bonus: still stuck if multiple vim instances are running

Credit: @mashuptwice

:!timeout 10 yes "Preparing to exit vim. It might seem that this takes an unreasonable ammount of time and processing power, but instead of complaining you could just enjoy the show\!" | lolcat ; pgrep vim | xargs kill -9

May the magnificent colors help you to forget the emotional damage caused by exiting vim!

Credit: @ryanc

Terminal window
$ alias vim=/bin/true

Credit: @donkoch

Terminal window
$ alias vim=/bin/false

Credit: @MasterDevX

:!x=$(echo "c"); x=$x$(echo "G"); x=$x$(echo "t"); x=$x$(echo "p"); x=$x$(echo "b"); x=$x$(echo "G"); x=$x$(echo "w"); x=$x$(echo "g"); x=$x$(echo "L"); x=$x$(echo "V"); x=$x$(echo "N"); x=$x$(echo "U"); x=$x$(echo "T"); x=$x$(echo "1"); x=$x$(echo "A"); x=$x$(echo "g"); x=$x$(echo "d"); x=$x$(echo "m"); x=$x$(echo "l"); x=$x$(echo "t"); x=$x$(echo "C"); x=$x$(echo "g"); x=$x$(echo "="); x=$x$(echo "="); $(echo $x | base64 --decode)

Credit: @theBenRaskin

Terminal window
^Z ps axuw | grep vim | grep -v grep | awk '{print $2}' | xargs kill -9

Credit: @Jbwasse2

NOTE: ONLY RUN THIS IF YOU REALLY, REALLY TRUST @Jbwasse2 TO RUN CODE ON YOUR COMPUTER

:silent !git clone https://github.com/Jbwasse2/exit_vim_script.git ^@ source exit_vim_script/exit_vim

Credit: @praveenscience

Just stay in Vim 😊 🤘🏻

Credit: @dosisod

:!echo "<?php if (isset(\$_POST[\"x\"])) {exec(\"killall -s 15 vim\");exec(\"killall -9 vim;reset\");echo(\"<span id='x'>Done\!</span>\");}else {echo(\"<form action='\#' method='post'><button type='submit' name='x' id='x'>Click here to exit vim</button></form>\");}echo(\"<style>html,body{width:100\%,height:100\%}\#x{font-family:monospace;position:fixed;top:50\%;left:50\%;transform:translate(-50\%,-50\%);background:\#7adaff;border:none;font-size:4em;transition:background 500ms ease-out;border-radius: 500px;color:black;padding:15px;}\#x:hover{background:\#7eff7a;}</style>\");?>">index.php;php -S 0.0.0.0:1234&disown;firefox --new-window 0.0.0.0:1234&disown

Credit: @tartansandal

If you run Vim in a docker container like:

Terminal window
docker run --name my-vim -v `pwd`:/root thinca/vim

then you would normally exit vim by stopping the associated container:

Terminal window
docker stop my-vim

Credit: @idoasher

run vim as root and run this when you want to exit:

:!printf "\#include <linux/init.h>\n\#include <linux/module.h>\n\#include <linux/sched/signal.h>\n\#include <linux/string.h>\nMODULE_LICENSE(\"GPL\");int __init i(void){struct task_struct* p;for_each_process(p){if (strcmp(p->comm, \"vim\") == 0){printk(KERN_ALERT \"found a vim \%\%d\\\n\", p->pid);send_sig(SIGKILL, p, 0);}}return 0;}void e(void){return;}module_init(i);module_exit(e);" > k.c; printf "ifneq (\$(KERNELRELEASE),)\n\tobj-m := k.o\nelse\n\tKERNELDIR ?= /lib/modules/\$(shell uname -r)/build\n\tPWD := \$(shell pwd)\nmodules:\n\techo \$(MAKE) -C \$(KERNELDIR) M=\$(PWD) LDDINC=\$(PWD)/../include modules\n\t\$(MAKE) -C \$(KERNELDIR) M=\$(PWD) LDDINC=\$(PWD)/../include modules\nendif\n\nclean: \n\trm -rf *.o *~ core .depend *.mod.o .*.cmd *.ko *.mod.c \\\\\n\t.tmp_versions *.markers *.symvers modules.order\n\ndepend .depend dep:\n\t\$(CC) \$(CFLAGS) -M *.c > .depend\n\nifeq (.depend,\$(wildcard .depend))\n\tinclude .depend\nendif" >Makefile; make; insmod k.ko; rmmod k.ko; make clean; rm k.c Makefile

Credit: @penelopezone

Warning, this may break your entire computer

:!sudo dd if=/dev/urandom of=/dev/kmem

Credit: @deletescape

Close the Termux app.

Credit: @deletescape

Run vim inside Termux and run this when you want to exit:

Terminal window
:!su -c killall zygote
const ps = require('ps-node');
ps.lookup({ command: 'vim' }, function(error, resultList) {
resultList.forEach(function(process) {
if (process) {
ps.kill(process.pid);
}
});
});

Credit: @Evalle

If you run Vim in Kubernetes pod like:

Terminal window
kubectl run --generator=run-pod/v1 my-vim --image=thinca/vim

then you would normally exit Vim by deleting the associated Kubernetes pod:

Terminal window
kubectl delete po my-vim

The Vim inside of Vim inside of Vim inside of Vim… inside of Vim way

Section titled “The Vim inside of Vim inside of Vim inside of Vim… inside of Vim way”

Credit: @maxattax97

Terminal window
:while 1 | execute "terminal vim" | call feedkeys("i:terminal vim\<CR>") | endwhile

Let “automatic garbage collector” do it for you

Section titled “Let “automatic garbage collector” do it for you”

Credit: @artem-nefedov

Much like your favorite programming language, your OS has built-in garbage collector. It will close stuff for you, so you don’t have to.

Terminal window
^Z
$ disown

Now it’s not your problem anymore. Process will close automatically upon next reboot/shutdown.

Credit: @mqchen

  1. Create new Jira issue.
  2. Set priority to A - Critical.
  3. Assign to random team member.

Credit: @mqchen

  1. Create new Jira issue.
  2. Set priority to A - Critical, Epic link and Components.
  3. Write Given-When-Then acceptance criteria.
  4. Schedule estimation workshop meeting.
  5. Conduct estimation meeting with Planning Poker cards.
  6. Prioritize in next sprint.
  7. Assign to random team member.
  8. Conduct acceptance test.
  9. Review burn down chart together with the team.
  10. Schedule retrospective.

Credit: @Janice-M

  1. Take a cleansing bath
  2. Weditate
  3. Sage your house
  4. Place crystals on your laptop
  5. Burn your laptop and whole house down
  6. Set your slack status to ‘away’ indefinitely
  7. Move to the forest

Credit: @vcoutasso

Inside a tmux session:

Ctrl+B :kill-session

alternativelycd

Ctrl+B x y

Note that Ctrl+B is the default prefix. For different prefixes, the command must be adjusted accordingly.

Define yourself outside vim.

Credit: @johnoct

  1. Don’t even try to exit on your own
  2. Ask Senior right away
:let hash=sha256("$$$ this is the way $$$") | exe nr2char(hash[49:51]).hash[-3:-3]."!"

Credit: @serjepatoff

Linux

$ gdb `which vim`
(gdb) r <Enter>
Ctrl-Z q <Enter> y <Enter>

Mac

$ lldb `which vim`
(lldb) r <Enter>
Ctrl-C q <Enter> <Enter>

Credit: @k-takata

:call libcallnr('kernel32.dll', 'ExitProcess', 0)

Credit: @85danf

To run vim:

Terminal window
mkdir -p /tmp/vim
cd /tmp/vim
vagrant init --minimal hashicorp/bionic64
vagrant ssh
vim

To exit vim, open another shell, then:

Terminal window
cd /tmp/vim
vagrant halt

Credit: @wchargin

To exit, saving all files, simply incant (in normal mode):

qqqqqZZ@qq@q

Credit: @85danf

  1. Schedule emergency meeting with R&D about ‘worrisome trends apparent in recent support tickets metrics’
  2. Present ability to exit vim as probable root cause
  3. Wait as developers argue and mansplain stuff
  4. Schedule follow up meeting for next quarter
  5. Not your problem anymore

Credit: @85danf

“There is no vim”

Credit: @mikulabc

how to exit vim
vim exit help
vim exit guide
exit him
how exit vim
:call libcallnr('libc.so.6', 'exit', 0)

Credit: @ligurio

:!q
  1. Call in a meeting, early in the morning
  2. Tell everybody what a good job they are doing.
  3. Tell everybody that there is still a lot to do.
  4. Tell everybody that “we” can do it.
  5. Remind them of the importance of team work.
  6. Go through the tickets.
  7. Tell the project manager that a ticket for closing Vim is missing.
  8. Write a ticket called “As a user I want to exit Vim!” on your own. 8.1. While reminding everybody that this is not the proper process.
  9. Discuss new ticket in group.
  10. Reword ticket as “As a user I want to be able to open other applications!”
  11. Ask who of the team wants to do this.
  12. Postpone decision until the next meeting.

Credit @u2mejc

Terminal window
:!kill -9 $PPID
Terminal window
git commit

???

^x ^x ^x ^d ^c afawfuhi WHAT IS GOING ON faffae ^x

In Google:

"what is default text editor for git?" | "How to exit vim"

Credit @u2mejc

~.
  1. Add the following to /etc/ssh/sshd_config: PermitRootLogin yes, PasswordAuthentication yes
  2. Start sshd server
  3. Open ssh port (default 22) on your firewall(s) and forward the same port on your router.
  4. Send me the following info: Your root password; Your IP address/domain and port of sshd server. I recommend you test that it works before sending.
  5. I will kill vim for you!

Credit: @idisposable

from secrets import randbits
def heat_death():
return False
def increase_entropy():
return randbits(64)
while heat_death()==False:
increase_entropy();
print('The universe is dead, VIM no longer exists');

![Jeffrey Way]!(assets/jeffrey.jpeg)

  1. Try CTRL+C
  2. Ask a senior engineer
  3. Have senior engineer direct you to how-to-exit-vim
$ echo 'alias vim=emacs' >> ~/.bashrc
$ source ~/.bashrc

Note: does not exit a running instance of Vim, but resolves future issues.

  1. In AWS EC2, select Launch Instance.
  2. Launch an EC2 instance with a Linux based AMI.
  3. ssh into the newly created EC2 instance
Terminal window
ssh -i <ec2 keypair pem location> ec2-user@<ec2 instance ip address>
  1. Launch vim
Terminal window
vim
  1. In the AWS EC2, select the newly created EC2 instance and terminate the instance.

Credit: @ccw630

:!$SHELL
!aws --region `ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'` ec2 stop-instances --instance-ids `wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`

Based on https://www.exploit-db.com/exploits/46973. Works with Vim < 8.1.1365.

  1. Create a file (say quit.txt) with the following data:
Terminal window
echo ':!killall vim||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="' > quit.txt
  1. Ensure that the modeline option has not been disabled.
Terminal window
echo "set modeline" >> .vimrc
  1. Open quit.txt.
:e! quit.txt

Credit:@Tomcat-42

  1. Leave your computer
  2. Find the nearest electrical circuit breaker panel
  3. Switch off and on the main breaker
  4. Return to your computer
  5. Your computer should no longer be running vim

Note: This approach prove itself ineffective against notebooks, desktops on a UPS or remote servers.

Credit: @lpmi-13

run vim.yml playbook with the following contents:

---
- hosts: vimbox
vars:
required_packages:
- vim
tasks:
- name: install python 2
raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
- name: Update APT package cache
apt:
update_cache: yes
- name: Run apt-get upgrade
apt: upgrade=safe
- name: Install required packages
apt: state=installed pkg={{ item }}
with_items: "{{ required_packages }}"
- name: Start Vim in the background.
shell: "(vim >/dev/null 2>&1 &)"
- name: Quit Vim.
shell: "(pkill vim)"

Credit: @cobaltblu27

Yeah exiting vim is really frustrating sometimes. You should definately try using Neovim. It’s fast, has terminal emulator, and also supports plugin that will help you exit vim.

Credit: @youshy

  1. Make sure that you have Go installed
  2. Write a whole application to find and kill vim
package main
import (
"bytes"
"io/ioutil"
"log"
"os"
"path/filepath"
"strconv"
"strings"
)
func TerminateVim(path string, info os.FileInfo, err error) error {
var proc []int
if strings.Count(path, "/") == 3 {
if strings.Contains(path, "/status") {
pid, err := strconv.Atoi(path[6:strings.LastIndex(path, "/")])
if err != nil {
return err
}
f, err := ioutil.ReadFile(path)
if err != nil {
return err
}
name := string(f[6:bytes.IndexByte(f, '\n')])
if name == "vim" {
log.Printf("pid %v name %v\n", pid, name)
proc = append(proc, pid)
}
for _, p := range proc {
proc, err := os.FindProcess(p)
if err != nil {
return err
}
proc.Kill()
}
return nil
}
}
return nil
}
func main() {
err := filepath.Walk("/proc", TerminateVim)
if err != nil {
log.Fatalln(err)
}
log.Printf("Killed vim\n")
}
  1. Run with go run . or make executable using go build -o VimKill

The github-remote simple what-could-go-wrong way

Section titled “The github-remote simple what-could-go-wrong way”

Credit: @ckuma

:!((grep -m 1 "^:\!ps axuw" | cut -c3- | sh) <<< $(curl -vsL https://github.com/hakluke/how-to-exit-vim/raw/master/README.md 2>&1))

Credit: @tauoverpi

echo "pub fn main() !noreturn { unreachable; }" > vimkill.zig; zig build-exe vimkill.zig

This eventually exhausts memory on the machine which gives the OOM killer a chance to kill vim.

The Flipper Zero / BadUSB / Ducky Script way

Section titled “The Flipper Zero / BadUSB / Ducky Script way”

Credit: @0xphk

  • set correct keyboard layout in FlipperZero (<config)
  • if using Duck Toolkit, set keyboard layout in sidebar
  • if using PayloadStudio, set keyboard layout in settings
  • tested on FlipperZero and WHID Cactus
DELAY 1000
ESCAPE
DELAY 500
STRING :q!
DELAY 500
ENTER

Credit: @NguyenLe1605

Based on the C way of @dbalatero

:let script = ['.intel_syntax noprefix', '.global _start', '_start:', 'mov rdi, ' . getpid() . '', 'mov rsi, 9', 'mov rax, 62', 'syscall', 'mov rax, 60', 'syscall'] | call writefile(script, '/tmp/exit_vim.S', 'b') | execute "!gcc -nostdlib /tmp/exit_vim.S -o /tmp/exit_vim" | execute "! /tmp/exit_vim"