====== vi / vim ======
[[https://vimhelp.org/editing.txt.html]]
* '':n'': nächste vim datei / nächstes vim fenster
* '':N'': vorherige vim datei / vorheriges vim fenster
* '':w'': speichern
* '':q'': beenden, aber nur wenn keine änderungen vorgenommen wurden und alle vim fenster besucht wurden
* '':q!'': beenden ohne zu speichern
* '':wq'': speichern und beenden, aber nur wenn alle vim dateien/fenster besucht wurden
* '':wq!'': speichern und beenden
* '':x'': das gleiche wie '':wq'', aber nur speichern, wenn änderungen vorgenommen wurden
* ''ZZ'' (kein '':''): das gleiche wie '':x''
* ''ZQ'' (kein '':''): das gleiche wie '':q!''
[[https://til.hashrocket.com/posts/2fdb6afb66-difference-between-wq-and-x|Difference Between :wq and :x]]
* '':wq'' -> schreibt die Datei __immer__ und beendet dann ''vim''
* '':x'' -> schreibt die Datei __nur dann__, wenn es Änderungen gegeben hat, und beendet dann ''vim''
update-alternatives --config editor
# ODER
echo "SELECTED_EDITOR=\"$(command -v vim 2> /dev/null || command -v vi 2> /dev/null)\"" > ~/.selected_editor
# ODER
export "EDITOR=\"$(command -v vim 2> /dev/null || command -v vi 2> /dev/null)\""; echo "EDITOR=\"$(command -v vim 2> /dev/null || command -v vi 2> /dev/null)\"" > ~/.bashrc
export "VISUAL=\"$(command -v vim 2> /dev/null || command -v vi 2> /dev/null)\""; echo "VISUAL=\"$(command -v vim 2> /dev/null || command -v vi 2> /dev/null)\"" > ~/.bashrc
===== Vim Maus deaktivieren =====
**Niemals** ''set mouse-=a'' setzen, sondern immer ''set mouse='' !!!
> echo "set mouse=" >> ~/.vimrc
===== minimale vim config =====
Damit die Farben sowohl bei weißem als auch bei schwarzem Hintergrund im ''vi''/''vim'' gut erkennbar sind, wird das ''colorscheme'' geändert.
cat << 'EOF' > ~/.vimrc
unlet! skip_defaults_vim
source $VIMRUNTIME/defaults.vim
set nocompatible
colorscheme ron
filetype plugin indent off
syntax on
set encoding=utf-8
set fileformats=unix,dos
set mouse=
set secure
EOF
===== ambitioniertere vim config =====
unlet! skip_defaults_vim
source $VIMRUNTIME/defaults.vim
set nocompatible
packadd! matchit
"colorscheme pablo
colorscheme torte
filetype plugin indent on
syntax on
highlight Normal cterm=NONE ctermbg=NONE ctermfg=NONE gui=NONE guibg=NONE guifg=NONE
set autoindent
set backspace=indent,eol,start
set encoding=utf-8
set fileformats=unix,dos
set hlsearch
set ignorecase
set incsearch
set list
set listchars=tab:\|·,trail:·,extends:≫,precedes:≪,eol:⏎,nbsp:␣
set mouse=
set number
set relativenumber
set ruler
set scrolloff=5
set shiftwidth=0
set showcmd
set showmatch
set showmode
set signcolumn=number
set smartcase
set smartindent
set smarttab
set smoothscroll
set softtabstop=-1
set tabstop=4
set timeout
set ttimeout
set ttimeoutlen=-1
set wildmenu
set secure
unlet! skip_defaults_vim
source $VIMRUNTIME/defaults.vim
set nocompatible
packadd! matchit
colorscheme slate
"colorscheme darkblue
"colorscheme desert
filetype plugin indent on
syntax on
highlight Normal cterm=NONE ctermbg=NONE ctermfg=NONE gui=NONE guibg=NONE guifg=NONE
set backspace=indent,eol,start
set encoding=utf-8
set fileformats=unix,dos
set hlsearch
set ignorecase
set incsearch
set mouse=
set number
set relativenumber
set ruler
set scrolloff=5
set shiftwidth=0
set showcmd
set showmatch
set showmode
set signcolumn=number
set smartcase
set smarttab
set smoothscroll
set softtabstop=-1
set tabstop=4
set timeout
set ttimeout
set ttimeoutlen=-1
set wildmenu
"set list
"set listchars=tab:\|·,trail:·,extends:≫,precedes:≪,eol:⏎,nbsp:␣
set secure
===== allgemeines =====
den "vim" auf einem Ubuntu-System installieren:
> aptitude -y install vim
[[https://wiki.ubuntuusers.de/VIM/|vimtutor]] auf deutsch:
> vimtutor de
[[https://wiki.ubuntuusers.de/VIM/|vimtutor]] auf englisch:
> vimtutor en
anständige Farben und guter Kontrast bei weißem und schwarzem Hintergrund + [[https://vim.fandom.com/wiki/How_to_stop_auto_indenting|autoindent abschalten]]:
# echo -e ":colorscheme delek\n:setlocal noautoindent\n:setlocal nocindent\n:setlocal nosmartindent\n:setlocal indentexpr=\nfiletype indent off\n" > ~/.vimrc
oder in Kurzform für das Home-Verzeichnis so [[https://vim.fandom.com/wiki/How_to_stop_auto_indenting|autoindent abschalten]]:
# echo -e ":colors delek\n:setl noai nocin nosi inde=\nfiletype indent off\n" > ~/.vimrc
oder
# echo -e ":colors pablo\n:setl noai nocin nosi inde=\nfiletype indent off\n" > ~/.vimrc
schaltet im vim die Zeilennummerierung an:
:set nu
schaltet im vim die Zeilennummerierung aus:
:set nonu
zeigt im vim die Zeilenumbrüche an:
:set list
==== Encoding ====
* [[https://stackoverflow.com/questions/778069/how-can-i-change-a-files-encoding-with-vim]]
* [[https://vimhelp.org/options.txt.html]]
* [[https://vimhelp.org/options.txt.html?#%27encoding%27]]
* [[https://vimhelp.org/options.txt.html?#%27fileencoding%27]]
um eine Datei mit dem VI in einem neuen Encoding zu speichern, muss das neue Encoding dem Schreibkommando übergeben werden:
> vi datei.txt
...
:write ++enc=utf-8 datei.txt
Das Encoding bei Start von ''vim'' setzen, bevor die Datei gelesen wurde:
# most shells on *nix / pwsh on windows
vim --cmd 'set encoding=utf-8' file.txt
Es gibt einen Unterschied zwischen "'':set encoding=utf-8''" und "'':set fileencoding=utf-8''"!
**''encoding''|''enc''**
Legt die in Vim verwendete Zeichencodierung fest. Es gilt für Text in den Puffern, Registern, Strings in Ausdrücken, Text, der in der viminfo-Datei gespeichert ist, usw. Es legt die Art von Zeichen fest, mit denen Vim arbeiten kann.
Das Ändern dieser Option wird die Kodierung des bestehenden Textes in Vim nicht ändern. Es kann dazu führen, dass Nicht-ASCII-Text ungültig wird. Es sollte normalerweise auf seinem Standardwert gehalten oder beim Start von Vim gesetzt werden.
Normalerweise entspricht 'Encoding' Ihrem aktuellen Gebietsschema. Dies ist die Standardeinstellung, wenn Vim Ihre Umgebungseinstellungen erkennt. Wenn „encoding“ nicht auf das aktuelle Gebietsschema eingestellt ist, muss „termencoding“ eingestellt werden, um eingegebenen und angezeigten Text zu konvertieren.
**''fileencoding''|''fenc''**
Legt die Zeichencodierung für die Datei dieses Puffers fest. Wenn sich „fileencoding“ von „encoding“ unterscheidet, erfolgt die Konvertierung beim Schreiben der Datei.
Wenn 'fileencoding' leer ist, wird derselbe Wert wie 'encoding' verwendet (keine Konvertierung beim Lesen oder Schreiben einer Datei). Beim Setzen des Wertes wird kein Fehler ausgegeben, nur wenn er verwendet wird, nur beim Schreiben einer Datei. Die Konvertierung erfolgt auch, wenn „encoding“ und „fileencoding“ beide eine Unicode-Codierung sind und „fileencoding“ nicht utf-8 ist. Das liegt daran, dass Unicode intern immer als utf-8 gespeichert wird.\\
__WARNUNG:__
Konvertierung kann zu Informationsverlust führen! Wenn „Kodierung“ „utf-8“ oder eine andere Unicode-Kodierung ist, erfolgt die Konvertierung höchstwahrscheinlich so, dass die umgekehrte Konvertierung denselben Text ergibt. Wenn die 'Kodierung' nicht "utf-8" ist, können einige Zeichen verloren gehen!
==== Byte Order Mark (BOM) ====
setzen:
:set bomb
entfernen:
:set nobomb
* Wenn eine Datei geschrieben wird und die folgenden Bedingungen erfüllt sind, wird der Datei eine BOM (Byte Order Mark) vorangestellt:
* diese Option ist an
* die Option 'binary' ist aus
* ''fileencoding'' ist "utf-8", "ucs-2", "ucs-4" oder eine der Little/Big-Endian-Varianten.
Einige Anwendungen verwenden das BOM, um die Codierung der Datei zu erkennen.
Wird häufig für UCS-2-Dateien unter MS-Windows verwendet.
Bei anderen Anwendungen verursacht es Probleme, zum Beispiel:
"''cat file1 file2''" lässt das BOM von ''file2'' in der Mitte der resultierenden Datei erscheinen.
Gcc akzeptiert keinen BOM. Wenn Vim eine Datei liest und ''fileencodings'' mit "ucs-bom" beginnt, wird auf das Vorhandensein der BOM geprüft und 'bomb' entsprechend gesetzt. Wenn „binary“ nicht gesetzt ist, wird es aus der ersten Zeile entfernt, sodass Sie es beim Bearbeiten nicht sehen. Wenn Sie die Optionen nicht ändern, wird das BOM beim Schreiben der Datei wiederhergestellt.
===== die 16 wichtigsten vim-Kommandos =====
[Esc] - in den Befehls-Modus wechseln
i - links vom Cursor in den Einfüge-Modus wechseln
I - links von der Zeile in den Einfüge-Modus wechseln
o - unter dem Cursor eine neue Zeile im Einfüge-Modus öffnen
O - über dem Cursor eine neue Zeile im Einfüge-Modus öffnen
a - rechts vom Cursor in den Einfüge-Modus wechseln
A - rechts von der Zeile in den Einfüge-Modus wechseln
s - das Zeichen, auf dem der Cursor steht, enfernen und genau an der Stelle in den Einfüge-Modus wechseln
S - die Zeile, auf dem der Cursor steht, leeren und in den Einfüge-Modus wechseln
. - wiederholt den letzten Befehl -> im nvi anders
u - macht die letzten Befehle rückgängig (Undo) -> im nvi anders
[Strg]+[R] - macht die letzten rückgängig gemachten Befehle wieder "rückgängig" (Redo) -> im nvi anders
x - löscht das Zeichen, auf dem der Cursor steht
dd - löscht die ganze Zeile (und fügt es in den Puffer ein)
yy - fügt die Zeile, in der der Cursor steht, in den Puffer ein
p - fügt den Inhalt aus dem Puffer in der Datei ein
==== weitere vim-Kommandos ====
cw - überschreibt das aktuell ausgewählte Wort
w - springt ein Wort anhand der Worttrenner weiter
z.B.: Ob beispielsweise mehr als nur "Leerzeichen" bzw. "Tabulatoren" Wörter voneinander trennen,
kann beispielsweise an Hand einer IP-Adresse (127.0.0.1) getestet werden.
Ursprünglich wurden Wörter nur durch Leerzeichen/Tabulatoren getrennt,
in dem Fall wäre die komplette IP-Adresse ein Wort, in vielen neueren Shells wird eine
IP-Adresse aber als 7 Worte angesehen => "127" + "." + "0" + "." + "0" + "." + "1"
G - Springt zum Dateiende
[Zahl]G - Springt zu der angegeben Zeile
dG - löscht den gesamten Bereich unterhalb des Cursors
d1G - löscht den gesamten Bereich oberhalb des Cursors
==== mit vim mehrere Dateien gleichzeitig öffnen ====
> vim datei_1.txt datei_2.txt datei_3.txt
:n - zur nächsten Datei wechseln
:N - zurück zur vorhergehenden Datei wechseln
:e# - zum Anfang zurück bzw. zur 1. Datei wechseln
===== ein Vim-Fork =====
[[https://youtu.be/c4OyfL5o7DU|Neovim in 100 Seconds]]
1976: Bill Joy schrieb den "vi"
1991: Bram Moolenaar schrieb "vim"
2014 kam "neovim"/"nvim", Fork von "vim"
siehe auch "nvchad