gui_x11.txt For Vim version 7.4. Last change: 2014 Mar 08LINK

VIM REFERENCE MANUAL by Bram Moolenaar

Vim's Graphical User Interface gui-x11 GUI-X11LINK

Athena MotifLINK

1. Starting the X11 GUI gui-x11-start

2. GUI Resources gui-resources

3. Shell Commands gui-pty

4. Various gui-x11-various

5. GTK version gui-gtk

6. GNOME version gui-gnome

7. KDE version gui-kde

8. Compiling gui-x11-compiling

9. X11 selection mechanism x11-selection

Other relevant documentation:

gui.txt For generic items of the GUI.

{Vi does not have any of these commands}

==============================================================================

1. Starting the X11 GUI gui-x11-start E665LINK

Then you can run the GUI version of Vim in either of these ways:

gvim [options] [files...]

vim -g [options] [files...]

So if you call the executable "gvim", or make "gvim" a link to the executable,

then the GUI version will automatically be used. Additional characters may be

added after "gvim", for example "gvim-5".

You may also start up the GUI from within the terminal version by using one of

these commands:

:gui [++opt] [+cmd] [-f|-b] [files...] :gu :guiLINK

:gvim [++opt] [+cmd] [-f|-b] [files...] :gv :gvimLINK

The "-f" option runs Vim in the foreground.

The "-b" option runs Vim in the background (this is the default).

Also see ++opt and +cmd.

gui-forkLINK

When the GUI is started, it does a fork() and exits the current process.

When gvim was started from a shell this makes the shell accept further

commands. If you don't want this (e.g. when using gvim for a mail program

that waits for gvim to exit), start gvim with "gvim -f", "vim -gf" or use

":gui -f". Don't use "vim -fg", because "-fg" specifies the foreground

color.

When using "gvim -f" and then ":gui", Vim will run in the foreground. The

"-f" argument will be remembered. To force running Vim in the background use

":gui -b".

"gvim --nofork" does the same as "gvim -f".

E851 E852LINK

When starting the GUI fails Vim will try to continue running in the terminal.

If you want the GUI to run in the foreground always, include the 'f'

flag in 'guioptions'. -f.

==============================================================================

2. GUI Resources gui-resources .XdefaultsLINK

If using the Motif or Athena version of the GUI (not for the KDE, GTK+ or Win32

version), a number of X resources are available. You should use Vim's class

"Vim" when setting these. They are as follows:

Resource name Meaning

reverseVideo Boolean: should reverse video be used?

background Color of background.

foreground Color of normal text.

scrollBackground Color of trough portion of scrollbars.

scrollForeground Color of slider and arrow portions of scrollbars.

menuBackground Color of menu backgrounds.

menuForeground Color of menu foregrounds.

tooltipForeground Color of tooltip and balloon foreground.

tooltipBackground Color of tooltip and balloon background.

font Name of font used for normal text.

boldFont Name of font used for bold text.

italicFont Name of font used for italic text.

boldItalicFont Name of font used for bold, italic text.

menuFont Name of font used for the menus, used when compiled

without the +xfontset feature

menuFontSet Name of fontset used for the menus, used when compiled

with the +xfontset feature

tooltipFont Name of the font used for the tooltip and balloons.

When compiled with the +xfontset feature this is a

fontset name.

geometry Initial geometry to use for gvim's window (default

is same size as terminal that started it).

scrollbarWidth Thickness of scrollbars.

borderWidth Thickness of border around text area.

menuHeight Height of the menu bar (only for Athena).

A special font for italic, bold, and italic-bold text will only be used if

the user has specified one via a resource. No attempt is made to guess what

fonts should be used for these based on the normal text font.

Note that the colors can also be set with the ":highlight" command, using the

"Normal", "Menu", "Tooltip", and "Scrollbar" groups. Example:

:highlight Menu guibg=lightblue

:highlight Tooltip guibg=yellow

:highlight Scrollbar guibg=lightblue guifg=blue

:highlight Normal guibg=grey90

font-sizesLINK

Note: All fonts (except for the menu and tooltip) must be of the same size!!!

If you don't do this, text will disappear or mess up the display. Vim does

not check the font sizes. It's the size in screen pixels that must be the

same. Note that some fonts that have the same point size don't have the same

pixel size! Additionally, the positioning of the fonts must be the same

(ascent and descent). You can check this with "xlsfonts -l {fontname}".

If any of these things are also set with Vim commands, e.g. with

":set guifont=Screen15", then this will override the X resources (currently

'guifont' is the only option that is supported).

Here is an example of what you might put in your ~/.Xdefaults file:

Vim*useSchemes: all

Vim*sgiMode: true

Vim*useEnhancedFSB: true

Vim.foreground: Black

Vim.background: Wheat

Vim*fontList: 7x13

The first three of these are standard resources on Silicon Graphics machines

which make Motif applications look even better, highly recommended!

The "Vim*fontList" is to set the menu font for Motif. Example:

Vim*menuBar*fontList: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-*

With Athena:

Vim*menuBar*SmeBSB*font: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-*

Vim*menuBar*MenuButton*font: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-*

NOTE: A more portable, and indeed more correct, way to specify the menu font

in either Motif or Athena is through the resource:

Vim.menuFont: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-*

Or, when compiled with the +xfontset feature:

Vim.menuFontSet: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-*

Don't use "Vim*geometry" in the defaults. This will break the menus. Use

"Vim.geometry" instead.

If you get an error message "Cannot allocate colormap entry for "gray60",

try adding this to your Vim resources (change the colors to your liking):

Vim*scrollBackground: Black

Vim*scrollForeground: Blue

The resources can also be set with arguments to Vim:

argument meaning

-guiLINK

-display {display} Run vim on {display} -displayLINK

-iconic Start vim iconified -iconicLINK

-background {color} Use {color} for the background -backgroundLINK

-bg {color} idem -bgLINK

-foreground {color} Use {color} for normal text -foregroundLINK

-fg {color} idem -fgLINK

-ul {color} idem -ulLINK

-font {font} Use {font} for normal text -fontLINK

-fn {font} idem -fnLINK

-boldfont {font} Use {font} for bold text -boldfontLINK

-italicfont {font} Use {font} for italic text -italicfontLINK

-menufont {font} Use {font} for menu items -menufontLINK

-menufontset {fontset} Use {fontset} for menu items -menufontsetLINK

-mf {font} idem -mfLINK

-geometry {geom} Use {geom} for initial geometry -geometryLINK

-geom {geom} idem, see -geometry-example -geomLINK

-borderwidth {width} Use a border width of {width} -borderwidthLINK

-bw {width} idem -bwLINK

-scrollbarwidthLINK

-scrollbarwidth {width} Use a scrollbar width of {width}

-sw {width} idem -swLINK

-menuheight {height} Use a menu bar height of {height} -menuheightLINK

-mh {height} idem -mhLINK

NOTE: On Motif the value is ignored, the menu height

is computed to fit the menus.

-reverse Use reverse video -reverseLINK

-rv idem -rvLINK

+reverse Don't use reverse video -+reverseLINK

+rv idem -+rvLINK

-xrm {resource} Set the specified resource -xrmLINK

Note about reverse video: Vim checks that the result is actually a light text

on a dark background. The reason is that some X11 versions swap the colors,

and some don't. These two examples will both give yellow text on a blue

background:

gvim -fg Yellow -bg Blue -reverse

gvim -bg Yellow -fg Blue -reverse

-geometry-exampleLINK

An example for the geometry argument:

gvim -geometry 80x63+8+100

This creates a window with 80 columns and 63 lines at position 8 pixels from

the left and 100 pixels from the top of the screen.

==============================================================================

3. Shell Commands gui-ptyLINK

WARNING: Executing an external command from the GUI will not always work.

"normal" commands like "ls", "grep" and "make" mostly work fine. Commands

that require an intelligent terminal like "less" and "ispell" won't work.

Some may even hang and need to be killed from another terminal. So be

careful!

There are two ways to do the I/O with a shell command: Pipes and a pseudo-tty.

The default is to use a pseudo-tty. This should work best on most systems.

Unfortunately, the implementation of the pseudo-tty is different on every Unix

system. And some systems require root permission. To avoid running into

problems with a pseudo-tty when you least expect it, test it when not editing

a file. Be prepared to "kill" the started command or Vim. Commands like

":r !cat" may hang!

If using a pseudo-tty does not work for you, reset the 'guipty' option:

:set noguipty

Using a pipe should work on any Unix system, but there are disadvantages:

- Some shell commands will notice that a pipe is being used and behave

differently. E.g., ":!ls" will list the files in one column.

- The ":sh" command won't show a prompt, although it will sort of work.

- When using ":make" it's not possible to interrupt with a CTRL-C.

Typeahead while the external command is running is often lost. This happens

both with a pipe and a pseudo-tty. This is a known problem, but it seems it

can't be fixed (or at least, it's very difficult).

gui-pty-eraseLINK

When your erase character is wrong for an external command, you should fix

this in your "~/.cshrc" file, or whatever file your shell uses for

initializations. For example, when you want to use backspace to delete

characters, but hitting backspaces produces "^H" instead, try adding this to

your "~/.cshrc":

stty erase ^H

The ^H is a real CTRL-H, type it as CTRL-V CTRL-H.

==============================================================================

4. Various gui-x11-variousLINK

gui-x11-printingLINK

The "File/Print" menu simply sends the current buffer to "lpr". No options or

whatever. If you want something else, you can define your own print command.

For example:

:10amenu File.Print :w !lpr -Php3

:10vmenu File.Print :w !lpr -Php3

X11-iconLINK

Vim uses a black&white icon by default when compiled with Motif or Athena. A

colored Vim icon is included as $VIMRUNTIME/vim32x32.xpm. For GTK+, this is

the builtin icon used. Unfortunately, how you should install it depends on

your window manager. When you use this, remove the 'i' flag from

'guioptions', to remove the black&white icon:

:set guioptions-=i

If you use one of the fvwm* family of window managers simply add this line to

your .fvwm2rc configuration file:

Style "vim" Icon vim32x32.xpm

Make sure the icon file's location is consistent with the window manager's

ImagePath statement. Either modify the ImagePath from within your .fvwm2rc or

drop the icon into one the pre-defined directories:

ImagePath /usr/X11R6/include/X11/pixmaps:/usr/X11R6/include/X11/bitmaps

Note: older versions of fvwm use "IconPath" instead of "ImagePath".

For CDE "dtwm" (a derivative of Motif) add this line in the .Xdefaults:

Dtwm*Vim*iconImage: /usr/local/share/vim/vim32x32.xpm

For "mwm" (Motif window manager) the line would be:

Mwm*Vim*iconImage: /usr/local/share/vim/vim32x32.xpm

Mouse Pointers Available in X11 X11_mouse_shapesLINK

By using the 'mouseshape' option, the mouse pointer can be automatically

changed whenever Vim enters one of its various modes (e.g., Insert or

Command). Currently, the available pointers are:

arrow an arrow pointing northwest

beam a I-like vertical bar

size an arrow pointing up and down

busy a wristwatch

blank an invisible pointer

crosshair a thin "+" sign

hand1 a dark hand pointing northeast

hand2 a light hand pointing northwest

pencil a pencil pointing southeast

question question_arrow

right_arrow an arrow pointing northeast

up_arrow an arrow pointing upwards

Additionally, any of the mouse pointers that are built into X11 may be

used by specifying an integer from the X11/cursorfont.h include file.

If a name is used that exists on other systems, but not in X11, the default

"arrow" pointer is used.

==============================================================================

5. GTK version gui-gtk GTK+ GTKLINK

The GTK version of the GUI works a little bit different.

GTK does _not_ use the traditional X resource settings. Thus items in your

~/.Xdefaults or app-defaults files are not used.

Many of the traditional X command line arguments are not supported. (e.g.,

stuff like -bg, -fg, etc). The ones that are supported are:

command line argument resource name meaning

-fn or -font .font font name for the text

-geom or -geometry .geometry size of the gvim window

-rv or -reverse *reverseVideo white text on black background

-display display to be used

-fg -foreground {color} foreground color

-bg -background {color} background color

To set the font, see 'guifont'. For GTK, there's also a menu option that

does this.

Additionally, there are these command line arguments, which are handled by GTK

internally. Look in the GTK documentation for how they are used:

--sync

--gdk-debug

--gdk-no-debug

--no-xshm (not in GTK+ 2)

--xim-preedit (not in GTK+ 2)

--xim-status (not in GTK+ 2)

--gtk-debug

--gtk-no-debug

--g-fatal-warnings

--gtk-module

--display (GTK+ counterpart of -display; works the same way.)

--screen (The screen number; for GTK+ 2.2 multihead support.)

These arguments are ignored when the +netbeans_intg feature is used:

-xrm

-mf

As for colors, Vim's color settings (for syntax highlighting) is still

done the traditional Vim way. See :highlight for more help.

If you want to set the colors of remaining gui components (e.g., the

menubar, scrollbar, whatever), those are GTK specific settings and you

need to set those up in some sort of gtkrc file. You'll have to refer

to the GTK documentation, however little there is, on how to do this.

See http://developer.gnome.org/doc/API/2.0/gtk/gtk-Resource-Files.html

for more information.

gtk-tooltip-colorsLINK

Example, which sets the tooltip colors to black on light-yellow:

style "tooltips"

{

bg[NORMAL] = "#ffffcc"

fg[NORMAL] = "#000000"

}

widget "gtk-tooltips*" style "tooltips"

Write this in the file ~/.gtkrc and it will be used by GTK+. For GTK+ 2

you might have to use the file ~/.gtkrc-2.0 instead, depending on your

distribution.

Using Vim as a GTK+ plugin gui-gtk-socketidLINK

When the GTK+ version of Vim starts up normally, it creates its own top level

window (technically, a 'GtkWindow'). GTK+ provides an embedding facility with

its GtkSocket and GtkPlug widgets. If one GTK+ application creates a

GtkSocket widget in one of its windows, an entirely different GTK+ application

may embed itself into the first application by creating a top-level GtkPlug

widget using the socket's ID.

If you pass Vim the command-line option '--socketid' with a decimal or

hexadecimal value, Vim will create a GtkPlug widget using that value instead

of the normal GtkWindow. This enables Vim to act as a GTK+ plugin.

This really is a programmer's interface, and is of no use without a supporting

application to spawn the Vim correctly. For more details on GTK+ sockets, see

http://www.gtk.org/api/

Note that this feature requires the latest GTK version. GTK 1.2.10 still has

a small problem. The socket feature has not yet been tested with GTK+ 2 --

feel free to volunteer.

==============================================================================

6. GNOME version gui-gnome Gnome GNOMELINK

The GNOME GUI works just like the GTK+ version. See GTK+ above for how it

works. It looks a bit different though, and implements one important feature

that's not available in the plain GTK+ GUI: Interaction with the session

manager. gui-gnome-session

These are the different looks:

- Uses GNOME dialogs (GNOME 1 only). The GNOME 2 GUI uses the same nice

dialogs as the GTK+ 2 version.

- Uses the GNOME dock, so that the toolbar and menubar can be moved to

different locations other than the top (e.g., the toolbar can be placed on

the left, right, top, or bottom). The placement of the menubar and

toolbar is only saved in the GNOME 2 version.

- That means the menubar and toolbar handles are back! Yeah! And the

resizing grid still works too.

GNOME is compiled with if it was found by configure and the

--enable-gnome-check argument was used.

GNOME session support gui-gnome-session gnome-sessionLINK

On logout, Vim shows the well-known exit confirmation dialog if any buffers

are modified. Clicking [Cancel] will stop the logout process. Otherwise the

current session is stored to disk by using the :mksession command, and

restored the next time you log in.

The GNOME session support should also work with the KDE session manager.

If you are experiencing any problems please report them as bugs.

Note: The automatic session save works entirely transparent, in order to

avoid conflicts with your own session files, scripts and autocommands. That

means in detail:

- The session file is stored to a separate directory (usually $HOME/.gnome2).

- 'sessionoptions' is ignored, and a hardcoded set of appropriate flags is

used instead:

blank,curdir,folds,globals,help,options,tabpages,winsize

- The internal variable v:this_session is not changed when storing the

session. Also, it is restored to its old value when logging in again.

The position and size of the GUI window is not saved by Vim since doing so

is the window manager's job. But if compiled with GTK+ 2 support, Vim helps

the WM to identify the window by restoring the window role (using the --role

command line argument).

==============================================================================

7. KDE version gui-kde kde KDE KVimLINK

gui-x11-kdeLINK

There is no KDE version of Vim. There has been some work on a port using the

Qt toolkit, but it never worked properly and it has been abandoned. Work

continues on Yzis: https://github.com/chrizel/Yzis.

==============================================================================

8. Compiling gui-x11-compilingLINK

If using X11, Vim's Makefile will by default first try to find the necessary

GTK+ files on your system. If the GTK+ files cannot be found, then the Motif

files will be searched for. Finally, if this fails, the Athena files will be

searched for. If all three fail, the GUI will be disabled.

For GTK+, Vim's configuration process requires that GTK+ be properly

installed. That is, the shell script 'gtk-config' must be in your PATH, and

you can already successful compile, build, and execute a GTK+ program. The

reason for this is that the compiler flags (CFLAGS) and link flags (LDFLAGS)

are obtained through the 'gtk-config' shell script.

If you want to build with GTK+ 2 support pass the --enable-gtk2-check argument

to ./configure. Optionally, support for GNOME 2 will be compiled if the

--enable-gnome-check option is also given.

Otherwise, if you are using Motif or Athena, when you have the Motif or Athena

files in a directory where configure doesn't look, edit the Makefile to enter

the names of the directories. Search for "GUI_INC_LOC" for an example to set

the Motif directories, "CONF_OPT_X" for Athena.

gui-x11-gtkLINK

At the time of this writing, GTK+ version 1.0.6 and 1.2 are outdated. It

is suggested that you use GTK 2. The GTK 1 support will most likely be

dropped soon.

For the GTK+ 2 GUI, using the latest release of the GTK+ 2.0 or GTK+ 2.2

series is recommended.

Lastly, although GTK+ has supposedly been ported to the Win32 platform, this

has not been tested with Vim and is also unsupported. Also, it's unlikely to

even compile since GTK+ GUI uses parts of the generic X11 code. This might

change in distant future; particularly because getting rid of the X11 centric

code parts is also required for GTK+ framebuffer support.

gui-x11-motifLINK

For Motif, you need at least Motif version 1.2 and/or X11R5. Motif 2.0 and

X11R6 are OK. Motif 1.1 and X11R4 might work, no guarantee (there may be a

few problems, but you might make it compile and run with a bit of work, please

send me the patches if you do). The newest releases of LessTif have been

reported to work fine too.

gui-x11-athenaLINK

The Athena version uses the Xaw widget set by default. If you have the 3D

version, you might want to link with Xaw3d instead. This will make the

menus look a bit better. Edit the Makefile and look for "XAW_LIB". The

scrollbars will remain the same, because Vim has its own, which are already

3D (in fact, they look more like Motif).

gui-x11-neXtawLINK

The neXtaw version is mostly like Athena, but uses different widgets.

gui-x11-miscLINK

In general, do not try to mix files from different GTK+, Motif, Athena and X11

versions. This will cause problems. For example, using header files for

X11R5 with a library for X11R6 probably doesn't work (although the linking

won't give an error message, Vim will crash later).

==============================================================================

9. X11 selection mechanism x11-selectionLINK

If using X11, in either the GUI or an xterm with an X11-aware Vim, then Vim

provides varied access to the X11 selection and clipboard. These are accessed

by using the two selection registers "* and "+.

X11 provides two basic types of global store, selections and cut-buffers,

which differ in one important aspect: selections are "owned" by an

application, and disappear when that application (e.g., Vim) exits, thus

losing the data, whereas cut-buffers, are stored within the X-server itself

and remain until written over or the X-server exits (e.g., upon logging out).

The contents of selections are held by the originating application (e.g., upon

a copy), and only passed on to another application when that other application

asks for them (e.g., upon a paste).

The contents of cut-buffers are immediately written to, and are then

accessible directly from the X-server, without contacting the originating

application.

quoteplus quote+LINK

There are three documented X selections: PRIMARY (which is expected to

represent the current visual selection - as in Vim's Visual mode), SECONDARY

(which is ill-defined) and CLIPBOARD (which is expected to be used for

cut, copy and paste operations).

Of these three, Vim uses PRIMARY when reading and writing the "* register

(hence when the X11 selections are available, Vim sets a default value for

'clipboard' of "autoselect"), and CLIPBOARD when reading and writing the "+

register. Vim does not access the SECONDARY selection.

Examples: (assuming the default option values)

- Select an URL in Visual mode in Vim. Go to your browser and click the

middle mouse button in the URL text field. The selected text will be

inserted (hopefully!). Note: in Firefox you can set the

middlemouse.contentLoadURL preference to true in about:config, then the

selected URL will be used when pressing middle mouse button in most places

in the window.

- Select some text in your browser by dragging with the mouse. Go to Vim and

press the middle mouse button: The selected text is inserted.

- Select some text in Vim and do "+y. Go to your browser, select some text in

a textfield by dragging with the mouse. Now use the right mouse button and

select "Paste" from the popup menu. The selected text is overwritten by the

text from Vim.

Note that the text in the "+ register remains available when making a Visual

selection, which makes other text available in the "* register. That allows

overwriting selected text.

x11-cut-bufferLINK

There are, by default, 8 cut-buffers: CUT_BUFFER0 to CUT_BUFFER7. Vim only

uses CUT_BUFFER0, which is the one that xterm uses by default.

Whenever Vim is about to become unavailable (either via exiting or becoming

suspended), and thus unable to respond to another application's selection

request, it writes the contents of any owned selection to CUT_BUFFER0. If the

"+ CLIPBOARD selection is owned by Vim, then this is written in preference,

otherwise if the "* PRIMARY selection is owned by Vim, then that is written.

Similarly, when Vim tries to paste from "* or "+ (either explicitly, or, in

the case of the "* register, when the middle mouse button is clicked), if the

requested X selection is empty or unavailable, Vim reverts to reading the

current value of the CUT_BUFFER0.

Note that when text is copied to CUT_BUFFER0 in this way, the type of

selection (character, line or block) is always lost, even if it is a Vim which

later pastes it.

Xterm, by default, always writes visible selections to both PRIMARY and

CUT_BUFFER0. When it pastes, it uses PRIMARY if this is available, or else

falls back upon CUT_BUFFER0. For this reason, when cutting and pasting

between Vim and an xterm, you should use the "* register. Xterm doesn't use

CLIPBOARD, thus the "+ doesn't work with xterm.

Most newer applications will provide their current selection via PRIMARY ("*)

and use CLIPBOARD ("+) for cut/copy/paste operations. You thus have access to

both by choosing to use either of the "* or "+ registers.

vim:tw=78:sw=4:ts=8:ft=help:norl: