4. 更多 X 配置

在查看 X 服务器和客户端的各种配置机制之前,应该注意的是,诸如 KDE 之类的桌面环境的出现变得流行,部分原因是它们可以通过友好的 “用户友好” GUI 控件来控制大部分用户交互配置。 事实上,作为各自桌面环境一部分的兼容应用程序最好通过桌面环境的配置工具或应用程序自身的 GUI 配置方法进行配置。 因此,例如,gtop,一个 GNOME 客户端应用程序,最好通过 GNOMEgtop 自身的菜单进行配置。 但这并非适用于所有 X 应用程序。

4.1. X 资源

X 服务器可以为客户端程序存储各种配置值,以便在需要时随时可用。 如果应用程序支持此功能,它将在每次调用该程序时将这些值用作默认值。 这些被称为 “资源”,通常用于定义用户对每个应用程序的字体、颜色、屏幕位置(几何形状)和各种其他属性的偏好。 这使得自定义应用程序变得容易。

资源被指定为文本字符串(例如 Netscape*blinkingEnabled: False),可以在 X 启动时从磁盘上的各个位置读取,甚至可以在命令行上交互式定义。 程序组件以分层方式命名,层次结构中的每个对象都由类和实例名称标识。 层次结构的顶层是应用程序本身的类和实例名称。 通常,应用程序的类名与程序名称相同,但首字母大写(例如 Vim 或 Emacs),尽管一些以字母 “X” 开头的程序也出于历史原因将第二个字母大写(例如 XTerm)。 每个定义都将指定一个类(或实例),以及相应的资源和值。 在此之下的层次结构是构成应用程序可定义方面的各种属性。

传统上,大多数 X 程序都是以这种方式配置的。 随着桌面环境的出现,它们通常有自己的配置机制,这种情况在今天已不再那么普遍。

例如,假设我们希望以蓝色背景运行 xterm。 因此,如果我们从命令行运行它,我们将像这样运行它

 xterm -bg blue &

 

如果这是我们的偏好,那么将此偏好放在某个文件中的某个位置,并让系统使用我们的偏好会更容易。 这样,每当我们启动 xterm 时,它都会使用我们首选的值,而我们不需要命令行选项(除非作为覆盖)。

基本的 X 资源语法表示为

 <program><binding><widget><binding><widget><...><resource>:<value>

 

在现实生活中,它通常看起来像这样

 xterm*fontMenu*background: darkblue

 

它所做的事情应该是显而易见的。 在定义中使用 “*” 称为 “松散绑定”,并充当通配符。 意味着 widget 层次结构中可能存在间隙。 例如

 xterm*background: darkblue

 

这也将为 xterm fontMenu 提供深蓝色背景,但也为任何其他具有 “background” 属性的 xterm 属性(例如窗口背景等)提供深蓝色背景,无论它们在 widget 层次结构中的哪个位置。 同样地

 *background: darkblue

 

这将为任何和所有支持它的程序定义背景——而不仅仅是 xterm。 使用 “.” 代替 “*” 会更精确,并且不允许层次结构中存在通配符间隙。 此外,应用程序必须支持特定的 widget 属性。“Background” 是一个相当安全的选择,但许多应用程序将具有更多不那么明显的专用资源。 最好查看本地文档(手册页等),或查看应用程序是否包含示例。 例如,Netscape 通常附带一个Netscape.ad文件,其中包含一组广泛的资源定义,可以自定义。

X 资源通常存储在多个位置(见下文),并由 xrdb 命令(见手册页)处理。

4.1.1. 应用程序默认值

存储首选应用程序资源的一种方法是通过以应用程序命名的文件,这些文件位于 “app-defaults” 目录中。 例如,在我的系统上,这些文件位于/usr/X11R6/lib/X11/app-defaults/,但这可能会因您的供应商选择的选项而异。 此目录包含许多知名 X 应用程序的文件,如 xtermxclockxcalcxload 等等。 总而言之,在整个方案中,应用程序的数量相对较少。 因此,并非所有应用程序都使用此方案。 事实上,大多数应用程序都不使用。

每个文件都将包含该应用程序的资源定义。 X 服务器在启动期间自行加载这些文件。 来自XTerm-color:

 ! $XFree86$

 #include "XTerm"

 *VT100*colorMode: on
 *VT100*dynamicColors: on

 ! Uncomment this use color for underline attribute
 !*VT100*colorULMode: on
 !*VT100*underLine: off

 ! Uncomment this to use color for the bold attribute
 !*VT100*colorBDMode: on

 *VT100*color0: black
 *VT100*color1: red3
 *VT100*color2: green3
 *VT100*color3: yellow3
 *VT100*color4: blue3
 *VT100*color5: magenta3
 *VT100*color6: cyan3
 *VT100*color7: gray90
 *VT100*color8: gray30
 *VT100*color9: red
 *VT100*color10: green
 *VT100*color11: yellow
 *VT100*color12: blue
 *VT100*color13: magenta
 *VT100*color14: cyan
 *VT100*color15: white
 *VT100*colorUL: yellow
 *VT100*colorBD: white

 

的简短示例,这主要是各种颜色定义。 应用程序类名未明确声明,而是从文件名中推断出来的。 因此,将每一行都视为以XTerm-color*开头。 另外,请注意顶部的#include "XTerm"行,它 “包含”XTerm 的资源定义,XTerm 是一个更长的文件,包含更多样化的定义。(由于篇幅原因未包含,但值得一看。) 这些文件提供系统范围的默认值,一般来说,用户通常不会编辑这些文件。

4.1.2. Xdefaults

另一种读取资源首选项的常用方法是使用Xdefaults文件。 或者,有时命名方案可能是Xresources代替。 这可能作为系统范围的文件存在,例如/etc/X11/Xresources。 当然,用户可以自由地在他的主目录中创建一个个人版本,例如~/.Xdefaults。 用户的版本将覆盖任何系统范围的设置,并在系统升级后保留。 显然,这是放置您自己偏好的地方。

Xresources文件使用 xrdb 命令读入资源数据库。 示例

 xrdb -merge ~/.Xresources

 

这可以在命令行上交互式完成,或者放在脚本中并在 X 会话启动时自动运行。 对于系统范围的文件,这应该由供应商提供的启动脚本来处理。 通常,此类脚本还会检查用户的主目录(请参阅xinitrc上面的示例)。 因此,可能需要做的就是使用文本编辑器创建文件。

这是一个示例,用于说明可以使用.Xdefaults文件完成的众多事情中的极少数

 ! This is a comment ;-)

 #ifdef COLOR
 *customization: -color
 #endif

 !! Let's cast a wide net, for any app supporting these
 ! Blink instead of beeping
 *visualBell: True
 *scrollTtyOutput: False
 *scrollKey:       True

 ! See Netscape.ad for many settable resources
 Netscape*noAboutSplash:	True
 Netscape*documentFonts.sizeIncrement: 5
 Netscape*documentFonts.xResolution*iso-8859-1: 120
 Netscape*documentFonts.yResolution*iso-8859-1: 120
 netscape-navigator*geometry: 960x820+240+140

 emacs*Background: DarkBlue
 emacs*Foreground: Wheat
 emacs*pointerColor: Orchid
 emacs*cursorColor: Orchid
 emacs*bitmapIcon: on
 emacs*font: 10x20

 ! GVim colors, etc
 !! GTK versions of gvim will not use all these.
 Vim*useSchemes:         all
 Vim*sgiMode:            true
 Vim*useEnhancedFSB:     true
 Vim.foreground:         Black
 !Vim.background:        lightyellow2
 Vim*background:         white
 ! geometry: width x height
 Vim.geometry:  88x40
 Vim*font:  -misc-fixed-medium-r-normal--20-200-75-75-c-100-iso8859-15-*5
 Vim*menuBackground: yellow
 Vim*menuForeground: black

 rxvt*backspacekey: ^?
 rxvt*background: Black
 rxvt*foreground: wheat
 rxvt*cursorColor: Orchid
 rxvt*geometry: 100x18+40+300 
 rxvt*title: Linux
 rxvt*reverseVideo: false
 !rxvt*backgroundPixmap: ~/penguinitis.xpm
 rxvt*scrollBar: true
 rxvt*reverseWrap: true
 rxvt*font: -*-lucidatypewriter-medium-*-*-*-14-*-*-*-*-*-*-*
 rxvt*fullCursor: true
 rxvt*saveLines:  1500
 rxvt*menu: ~/rxvt.menu

 XTerm*saveLines:    1500
 ! Do not clear the screen after the program exits
 XTerm*VT100*titeInhibit: true

 ! Fix up xterm's keybindings 
 xterm*VT100.translations:	#override \
       <Key>BackSpace:    string(0x7F) \n\
       <Key>Insert:       string(0x1b) string("[2~")\n\
       <Key>Delete:       string(0x1b) string("[3~")\n\
       <Key>Home:         string(0x1b) string("[1~")\n\
       <Key>End:	     string(0x1b) string("[4~")\n\
       <Key>Page_Up:      string(0x1b) string("[5~")\n\
       <Key>Page_Down:    string(0x1b) string("[6~")\n\
       <KeyPress>Prior : scroll-back(1,page)\n\
       <KeyPress>Next : scroll-forw(1,page)

 ! Ghostview
 Ghostview*Font: *-helvetica-bold-r-normal--12-*-*-*-*-*-*
 Ghostview*BorderColor:  white
 Ghostview*Text*Font:    rk14
 Ghostview*Background:   #d9d9d9
 !Ghostview*Foreground:  white
 ghostview.form.pageview.page.background: white
 ghostview.form.pageview.page.foreground: black
 .ghostview.zoom.form.page.background: white
 .ghostview.zoom.form.page.foreground: black

 ! xscreensaver !
 ! Time out after 12 minutes, cycle mode after each 2
 xscreensaver.timeout: 12
 xscreensaver.cycle: 5
 ! Run low priority, and fade between modes
 xscreensaver.nice: 12
 xscreensaver.fadeSeconds: 2

 XFontsel.menu.options.showUnselectable: False
 
 

希望这些简单的示例能为您提供一些构建的基础。 如果在更改后从命令行交互式使用 xrdb,则不需要重新启动 X。 效果是立竿见影的。

资源有时也可以作为命令行选项使用。 见下文。 命令行选项将覆盖任何现有的资源定义。

4.2. xmodmap,键盘和鼠标

键盘和鼠标以及其他可能的输入设备在XF86Config(或XF86Config-4)中定义。 有一个键盘布局是根据首选语言定义的

 Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "keyboard"
	Option      "XkbLayout"	"us"
 EndSection

 

这为我们提供了默认的键盘布局。 有效的布局标签在/usr/X11R6/lib/X11/xkb/symbols中列出。 此外,setxkbmap 实用程序可用于交互式地更改此设置。

X 是高度可定制的,我们可以修改键盘和鼠标指针映射以适应我们自己的偏好。 用于执行此操作的实用程序是 xmodmap(请参阅手册页)。 您不喜欢 Caps Lock 键的位置? 那么移动它 ;-)

xrdb 类似,xmodmap 可以从命令行运行。 或者,首选设置可以存储在文件中。 通常是~/.Xmodmap或类似的。 如果您的 X 启动文件没有解析它,请进行适当的编辑以使其解析(可能从~/.xinitrc~/.xsession).

您可以使用:xmodmap -pk -pp | less 查看当前的键盘和鼠标映射。 这将打印出所有活动的 “keycode” 值,以及相应的 “keysym” 值,以及 xmodmap 知道的任何 keysym 名称(例如 “BackSpace”)。 并且还应该让您了解 xmodmap 如何理解键盘和鼠标事件。 每个键码有两个 keysym。 第二个是 Shift 值。 XFree86 的 xev 实用程序可用于交互式地转储有关按键和鼠标事件的大量信息。 注意 “keycode” 值。 这是您需要知道的才能重新映射的内容。

xmodmap 通常用于进行小的键盘调整,例如正确的退格/删除映射。 或者可以用于进行重大调整,例如用于国际映射。 您只能重新映射按键和鼠标事件——您不能将宏分配给按键事件(您的窗口管理器或桌面环境可能具有此功能的某些部分)。

设置国际键盘 的精彩讨论。 此外,Google 搜索 将会找到许多富有创意的示例。

手册页包含许多关于各种用法的简短示例。 这是一个假设的~/.Xmodmap可能看起来像

 ! /home/hal/.Xmodmap, last change 10/03/01
 !
 ! Force backspace to 22 and Delete to 111
 keycode 22 = BackSpace
 keycode 111 = Delete
 !
 ! My keyboard handles right and left Alt differently. Make the 
 ! Right act like the Left to avoid digital gymnastics.
 keycode 63 = Alt_L
 keycode 113 = Meta_L
 !
 ! Hard-code the keypad to numeric values as if numlock is always on 
 ! since I never use it for anything else.
 keycode 79=7
 keycode 80=8
 keycode 81=9
 keycode 83=4
 keycode 84=5
 keycode 85=6
 keycode 87=1
 keycode 88=2
 keycode 89=3
 keycode 90=0
 keycode 91=period
 keycode 86 = plus
 ! deactivate Num_Lock key since we don't need it now.
 keycode 77 =
 !
 ! My capslock is next to tab. I hit it by mistake sometimes, 
 ! and don't use it anyway. So make capslock act like Tab.
 keycode 66 = Tab
 clear lock
 !
 ! Reverse mouse buttons for left-handed people
 pointer = 3 2 1

 

与许多 XFree86 文件一样,“!” 表示注释。 另一种可能的用途是重新定义那些烦人的 “Windows” 键以使其有用。 希望这能让您了解一些您可能想要做的事情,以使键盘更适合我们。

说到Numlock键,X 通常会在启动时禁用它。 无论您如何在 BIOS 中设置,或在 X 启动之前 Linux 如何设置。 因此,上面的技巧是一种方法。 还有一个实用程序可用作 numlockxsetnumlock,可以在 Internet 上找到,如果您的发行版不包含其中一个或另一个。 这可以放在启动文件中以打开Numlock如果您愿意,可以自动打开。

窗口管理器和桌面环境也允许自定义键盘和鼠标(只要 X 正确识别它们)。 这可能是配置某些自定义设置的更简单方法。

4.2.1. 特殊按键映射

XFree86 中传统上使用了几个特殊的按键映射。

Ctrl-Alt-退格键

将以有序的方式终止 X 服务器进程。 这是快速、简单、合法地重启 X 的方法。 请注意,它不会重启显示管理器(如果使用)——仅重启 X 本身。

Ctrl-Alt-Fn

其中n对应于有效的 TTY 编号(通常为 1-6)。 这通常用于跳转到文本控制台登录,同时 X 保持运行。 要返回 X,请按 Alt-Fn。 在这种情况下,n表示最后一个 TTY 加 1(例如,如果有六个可用的 TTY,则为 Alt-F7)。

Ctrl-Alt-+Ctrl-Alt--

即小键盘上的加号和减号键。 这将循环浏览任何现有的有效屏幕分辨率模式,例如 1024�768 → 600�800。 请注意,实际屏幕尺寸是相同的——只是视图和分辨率发生变化。 对于大多数用途来说,这并不是很有用。 您无法在不重启 X 的情况下永久更改屏幕分辨率。

您的窗口管理器、桌面环境或其他系统组件可能会捕获这些,并改变标准行为。 此外,Ctrl-Alt-Delete 也可能被捕获。 如果可用,这应该有序地关闭 X(和系统)。

4.2.2. 鼠标和指针

如前所述,Linux 和 Unix 大量使用三个鼠标按钮。 如果鼠标只有两个按钮,则可以通过同时按下两个按钮来模拟第三个按钮(即中间按钮)。 这是在XF86Config中设置为 “Emulate3Buttons” 指令的配置选项

 Section "InputDevice"
	Identifier  "Mouse0"
	Driver      "mouse"
	Option      "Device" "/dev/mouse"
	Option      "Protocol" "PS/2"
	Option      "Emulate3Buttons" "on"
 EndSection

 

总而言之,第三个按钮非常方便,我个人建议使用一个。 在滚轮鼠标上,“滚轮” 在按下时充当第三个按钮。 许多标准滚轮鼠标似乎与 “IMPS/2” 协议选项配合使用。

具体来说,第三个按钮(中间)几乎在所有 Linux 应用程序中都是 “粘贴” 按钮。 复制和粘贴在 Linux 中的工作方式略有不同。 左键是复制按钮。 只需按住它,然后在文本上拖动。 它会自动复制到 X “剪贴板”。 然后,中间按钮将从那里粘贴。 一个非常简单的过程。 双击应复制单个单词,三击应复制单行文本。 如果由于某种原因,这不起作用,则要么是应用程序实现不佳,要么是某种错误。 例如,某些旧版本的 Netscape 在这方面不一致。 要从键盘粘贴,应该是 Shift+Insert。

“拖放” 本身不受 X 本身的原生支持。 但是,某些工具包和桌面环境实现了它。 不应期望它与不兼容的应用程序一起使用(例如,KDE 中非 KDE 感知的应用程序)。

4.3. xset

xset 是另一个 XFree86 实用程序,用于设置用户首选项。xset 有点像包罗万象的工具,用于更改各种不相关的 X 服务器设置。 主要这是一种命令行方式,用于配置与XF86Config中定义的某些内容相同的内容(但不是全部!)。

xset 的常用用法是打开或关闭 DPMS 并设置首选间隔,动态更改 FontPath 或重新读取它,控制键盘 LED,调整鼠标(或其他指针)移动速度,设置键盘 “自动重复”“重复” 速率,以及控制 X 的内置屏幕保护程序。 当然,请参阅手册页以获取详细说明和其他 xset 用法。

同样,xset 可以从命令行交互式使用。 但最常见的做法是将首选设置存储在启动配置文件之一中,例如.xinitrc.xsession。 一个非常简短的例子

 # Turn off screen blanking
 xset s off
 
 # Enable DPMS energy saving
 xset +dpms
 
 # Tweak the rodent
 xset m 30/10 4
 
 # Speed up keyboard
 xset r rate 200 40

 

您的桌面可能具有用于 xset 的 GUI 前端。