Du er her: Hjem --> Annet --> Blog --> Vi og Vim teksteditor

Avansert Vi og Vim

Vi er en teksteditor som følger med alle UNIX-baserte systemer(Mac, Linux). Vi har mange avanserte funksjoner og kan brukes med kun tastaturkommandoer - ingen klikking med mus i menyer osv. Dette gjør at den er rask å jobbe med. Vim er Vi improved - dvs Vi med flere funksjoner.

Det finnes også en Vi/Vim versjon for PC.

End-of-line karakter

Tegnet som markerer end-of-line i en tekstfil er forskjellig fra UNIX (Linux, Mac) og PC. På UNIX markeres end-of-line med LF "karakteren" (koden) (LineFeed, ASCII desimal 10). Man kan visualisere denne koden med kommandoen

:set list

Da vil LF vises som $-tegn. Slå av visningen med

:set nolist

På en PC markeres end-of-line med to tegn - CR (CarriageReturn, ASCII desimal 13) og LF. CR visualiseres ved å gi parameteren -b når Vi startes. Da skrives tegnet ^M inn i filen der koden CR er lagret. ADVARSEL: I min Vi/Vim forblir dette tegnet i filen dersom man lagrer filen. Så med -b parameteren bør filen ikke lagres, kun lese. Det er uklart hvordan dette dette er ment å fungere, om det er en feil i min versjon.

vi -b myfile.txt

Tidligere lagde Vi på PC filer med kun LF som end-of-line. Hvis man åpnet en slik fil i Notepad vistes alle linjene etterhverandre - det var ingen linjeskift. Dette er rettet i min Vi versjon.

Finn installert Vi og Vim versjon

vi --version
vim --version

I Vi/Vim:

:version

Kopier til og fra Windows clipboard

Bufferen * gir tilgang til Windows clipboard for Vim installet på PC. På min maskin fungerer dette bare med Vim, ikke Vi.

Kopier en linje til Windows clipboard:

"*yy

Nå kan denne linjen limes inn i Notepad eller et annet program med Ctrl-v

Tilsvarende kan man markere tekst i Notepad eller et annet program og kopiere dette til Windows Clipboard med med Ctrl-c. Og så lime inn innholdet i Vim:

"*p

Karaktersett og encoding

Når man trykker på en tast på tastaturet vil karakteren lagres i maskinens minne som en eller flere byte (0'er og 1'ere - eller egentlig kapasitorladning av og på). Kanskje vises også karakteren på en skjerm. Hva er det som avgjør den lagrede bytekoden? Og hvordan karakteren vises?

Tastaturet, language, locale

Det finnes forskjellige tastaturer for språk med forskjellige tegn - eksempelvis så bruker vi her i Norge et spesialtastatur med de norske tegnene æ, ø, å. Hvilket tastatur man - det vil si hvilke koder som genereres når man trykker de forskjellige tastene - angis typisk når man installerer operativsystemet. Samlingen av informasjon knyttet til brukerens geografi - operativsystemets visningsspråk (hvilket språk menyer i Explorer osv er i), formatet på datovisning, og tastaturlayout, kalles ofte "locale".

I Windows10 kan man se locale-informasjon i Settings - Time&Language. Jeg liker å ha engelsk visningsspråk og norsk tastaturlayout: velg Region&Language, installer aktuelt visningsspråk (ofte installert da du installerte OS), trykk på visningsspråket og det kommer frem en knapp "Options". Her får du mulighet til å "Add a keyboard". Legg til de keyboardene man vil ha - eksempelvis engelsk, norsk, tysk. I taskbar nede til høyre er det et ikon som viser ENG-NO når man har engelsk visningsspråk-norsk keyboardlayout. Ved å klikke dette ikonet man kan velge mellom de tre alternativene vi nå har konfigurert. Aller enklest er det å bytte ved å bruke tastatur shortcut Win-space.

Jeg ønsker å teste hvordan dette fungerer med Vi, ved å trykke p og å tastene tre ganger hver på mitt norske tastatur. Først velger jeg ENG-NO:
påpåpå
Så velger jeg ENG/US:
p[p[p[
Så velger jeg German-German:
püpüpü
German-german har scharfes-ess på norsk-tastatur ?-tasten:
ßßßßßß

Noen locale-relevante kommandoer:
set
:language
For å endre locale:
setenv NO
:language l_Norway.1252

Codepage og font

Tidligere hadde man en installert codepage. Dette var et kart med karakterer og tilhørende koder, ascii fra 0-127, egendefinert fra 128-255. Koden fra tastaturet kan nå matches med en karakter og en kode. Koden kan lagres i minnet eller på harddisk. Karakteren kan visualiseres på en skjerm. Hver karakter opptar 1 byte lagringsplass. For visualisering må man også ha en Font. Fonten må matche karakterene og kodene i installert codepage. Ellers vil ikke visningen fungere. Eksempel på codepages er 437 (US) og 865 (Norwegian) (cp437, cp865, cp står for codepage). Eksempel på font er Arial og Times New Roman. Codepages er et Windows-begrep. Etterhvert ble det mange codepages og komplisert å få dette systemet til å henge sammen, og man ønsket en mer systematisk tilnærming.

Karaktersett

Et karaktersett er i utgangspunktet liknende en codepage. Ofte er de laget av et uavhengig organ - ISO. De kan også inneholde flere enn 256 karakterer, og noen eller alle karakterene opptar da mer enn 1 byte. (Det er vanlig at de 128 karakterene er identiske med ASCII-karakterene.) Også her er karaktersettet og kodingen et og samme system. Kodene kan for eksempel lagres i 2 byte.

ISO 8859-1 er en 1-byte mal for karaktersett. Endel av kodene er tilordnet karakter, endel er ledige. Flere karaktersett er laget på bakgrunn av denne malen. For eksempel Latin-1 (også kalt ISO-8859-1, merk ekstra bindestrek) og Windows-1252 (også kalt ANSI og Western European).

Systemet med slike karaktersett er stort sett gått ut på dato nå når Unicode er kommet.

Unicode karaktersett og UTF-8 encoding

Unicode bygger på ovenfornevnte karaktersett, men med viktige og fundamentale forskjeller. For det første inneholder Unicode mange flere karakterer - stor sett alle som finnes i alle språk i verden. Og for det andre er encodingen av karakterene et eget, separat system - for eksempepl UTF-8.

Unicode har over en million karakterer. Som i ASCII og andre karaktersett nummereres hver karakter fra 0 til et tall over en million, og hvert karakters nummer kalles et codepoint. Med noe over en million codepoints vil det si at vi må ha 4 byte for å lagre de største codepointsene. Dette er et dårlig system fordi det sløser med minne/harddisk og har ikke ASCII kompatibilitet. For Unicode har man derfor laget egne systemer for encodingen. For eksempel UTF-8 og UTF-16. UTF-8 er mest brukt. En Unicode karakter lagres ikke som karakterens codepoint (dvs nummereringen i karaktersettet). UTF-8 har en algoritme som gjør en konvertering av codepoint og karakteren lagres som en annen bitsekvens, på mellom 1 og 6 byte. De karakterene som brukes mye (for eksempel ASCII karakterene) lagres i kun 1 byte. Andre karakterer lagres i 2 byte (blant annet æ, ø, å), 3 byte osv. Vanligvis holder det med 4 byte til å lagre tall opp til 4 millioner (2^32). Årsaken til at UTF-8 bruker opp til 6 byte selv om antall codepoint er rundt en million har å gjøre med hvordan Unicode og UTF-8 er bygget opp. Og jeg velger å ikke diskutere dette her.

Ved å skille karaktersettet og encodingen får man et ekstra softwarelag - det vil si man behøver mer ressurser for prossesering. Til gjengjeld får man et mye større karaktersett og lite sløsing med lagringsplass.

Her er en side der man kan skrive inn en karakter og få både karakterens codepoint og UTF-8 encodingen: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C3%A5&mode=char. Ved å legge inn æ, ø og å ser vi at våre norske tegn lagres i 2 byte med UTF-8.

Karaktersett og encoding i Vi og Vim

Jeg har tidligere hatt problemer med Vi på PC der de norske tegnene æ, ø og å ikke vises riktig.

set encoding

Viser filens encoding i teksteditoren, ikke slik den lagres på disk.

set fileencoding

Viser filens encoding slik den lagres på disk.

Man kan endre disse med tilsvarende kommandoer:

set encoding=utf8
set encoding=latin1
set fileencoding=utf8
set fileencoding=latin1

Kommandoen file gir detaljer rundt filen:

file myfile.html

Andre relevante kommandoer:

:fileencoding
Sets the character encoding for the file of this buffer when written to disk. When 'fileencoding' is different from 'encoding', conversion will be done when writing the file. For reading see below. When 'fileencoding' is empty, the same value as 'encoding' will be used (no conversion when reading or writing a file). No error will be given when the value is set, only when it is used, only when writing a file. Conversion will also be done when 'encoding' and 'fileencoding' are both a Unicode encoding and 'fileencoding' is not utf-8. That's because internally Unicode is always stored as utf-8. WARNING: Conversion can cause loss of information! When reading a file 'fileencoding' will be set from 'fileencodings'. To read a file in a certain encoding it won't work by setting 'fileencoding', use the |++enc| argument. One exception: when 'fileencodings' is empty the value of 'fileencoding' is used. For a new file the global value of 'fileencoding' is used. :fileencodings
This is a list of character encodings considered when starting to edit an existing file. When a file is read, Vim tries to use the first mentioned character encoding. If an error is detected, the next one in the list is tried. When an encoding is found that works, 'fileencoding' is set to it. If all fail, 'fileencoding' is set to an empty string, which means the value of 'encoding' is used. :++enc
You can reload a file using a different encoding if Vim was not able to detect the correct encoding: :e ++enc= For example, on Windows in western Europe, the default encoding is latin1. However I often use Vim to edit files that must be encoded using the console codepage which is is usually cp850 or cp437. So I reload the file using this command: :e ++enc=cp850 If you need to do this often, you can maritten. If you do set 'fenc' in a modeline, you might want to set :termencoding
:encoding
Normally 'encoding' will be equal to your current locale. This will be the default if Vim recognizes your environment settings. If 'encoding' is not set to the current locale, 'termencoding' must be set to convert typed and displayed text. See |encoding-table|. Normally 'encoding' is equal to your current locale and 'termencoding' is empty. This means that your keyboard and display work with characters encoded in your current locale, and Vim uses the same characters internally. You can make Vim use characters in a different encoding by setting the 'encoding' option to a different value. Since the keyboard and display still use the current locale, conversion needs to be done. The 'termencoding' then takes over the value of the current locale, so Vim converts between 'encoding' and 'termencoding'. Example: :let &termencoding = &encoding :set encoding=utf-8 However, not all combinations of values are possible. The table below tells you how each of the nine combinations works. This is further restricted by not all conversions being possible, iconv() being present, etc. Since this depends on the system used, no detailed list can be given. ('tenc' is the short name for 'termencoding' and 'enc' short for 'encoding'). When tenc is 8bit and enc is Unicode: Works, but only 8bit characters can be typed directly (others through digraphs, keymaps, etc.); in a terminal you can only see 8bit characters; the GUI can show all characters that the 'guifont' supports. http://vimdoc.sourceforge.net/htmldoc/mbyte.html

Dekoding av html-sider

Tidlig i en html-side står:
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
Dette angir hvordan nettsiden skal dekodes.

charmap karakterer

Start programmet med å skrive charmap i Run-vinduet. Dette er et program for å kopiere inn tegn som ikke finnes på tastaturet. For eksempel:
ȸȹɃɇ
Legg merke til linjen nederst i applikasjonen. Til venstre står karakterens encoding (eller code point?). Til høyre står en alt-kombinasjon - en måte å produsere karakteren med alt og num-tastene på numlock tastaturet.

Det fungerer å kopiere charmap karakterer inn i Vi via Windows clipboard.

alt koder

Tegn som ikke finnes på keyboardet kan produseres å holde alt inne og så trykke koder på talltastaturet på høyre side av tastaturet. Fungerer med Notepad men får det ikke til å fungere med Vi.
http://www.borgendale.com/keyboard.pdf
http://www.irongeek.com/alt-numpad-ascii-key-combos-and-chart.html

Vi keymap

http://vimdoc.sourceforge.net/htmldoc/mbyte.html#mbyte-keymap 9. Input with a keymap. When the keyboard doesn't produce the characters you want to enter in your text, you can use the 'keymap' option. This will translate one or more (English) characters to another (non-English) character. This only happens when typing text, not when typing Vim commands. This avoids having to switch between two keyboard settings. INPUT There are several ways to enter multi-byte characters: - For X11 XIM can be used. See |XIM|. - For MS-Windows IME can be used. See |IME|. - For all systems keymaps can be used. See |mbyte-keymap|. The options 'iminsert', 'imsearch' and 'imcmdline' can be used to chose the different input methods or disable them temporarily.


http://vimdoc.sourceforge.net/htmldoc/usr_45.html#45.4

Vi digraphs

Man kan lage non-ascii karakterer i Vi med Digraphs. Ctrl-k a! blir til à. ctrl-k p* blir til π. Referanse: Oreilly: learning the Vi and Vim editors, s.287 og Vim hjelpesystem, :help digraphs. List opp støttede sekvenser med kommandoen

:digraph Digraphs are used to enter characters that normally cannot be entered by an ordinary keyboard. These are mostly printable non-ASCII characters. The digraphs are easier to remember than the decimal number that can be entered with CTRL-V (see |i_CTRL-V|). There is a brief introduction on digraphs in the user manual: |24.9| An alternative is using the 'keymap' option.

Vi hex codes, Ctrl-V

https://unix.stackexchange.com/questions/366869/what-does-ctrlv-do-in-vim https://unix.stackexchange.com/questions/61118/how-to-enter-non-ascii-characters-using-hex-or-octal-codes-in-vi
http://vimdoc.sourceforge.net/htmldoc/usr_45.html#45.4 ßßßß c cwww.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C3%9F&mode=char http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C3%9F&mode=char
https://unix.stackexchange.com/questions/61118/how-to-enter-non-ascii-characters-using-hex-or-octal-codes-in-vi
http://vimdoc.sourceforge.net/htmldoc/usr_45.html#45.4
www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C3%9F&mode=char c p :version editer _vimrc filen med: :set encoding=utf-8 :set fileencodings=utf-8 for å se unicode-koden til en karakter i filen: marker karakteren, ga p

Vi hjelpesystem

Kan nå hjelpesystemet med å trykke :h eller :help, eller :h der stikkord er det du behøver hjelp til. For å navigere i hjelp-systemet kan man markere linker og trykke Ctrl-]. For meg fungerte dette siste bare dersom jeg endrer locale slik at tastaturet er amerikans. Da sitter ]-tasten til høyre for der norsk å sitter (to til høyre for p).

Referanser

  1. readme
    http://vimdoc.sourceforge.net/htmldoc/mbyte.html
  2. readme
    http://vim.wikia.com/wiki/Working_with_Unicode
  3. readme
    https://en.wikipedia.org/wiki/Windows-1252
  4. readme
    https://no.wikipedia.org/wiki/ISO_8859-1
  5. readme
    http://vim.wikia.com/wiki/Working_with_Unicode
  6. readme
    http://vim.wikia.com/wiki/Reloading_a_file_using_a_different_encoding
  7. https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
  8. http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C3%A5&mode=char
    http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C3%A5&mode=char
  9. http://unicode.org/index-classic.html
    http://unicode.org/index-classic.html
Telefon: 67 20 71 21 / 92 60 51 57 Logo-tema