Skip to main content

Interface: TextViewProps

Defined in: react/src/generated/jsx.ts:5776

Props for the TextView widget.

Extends

Properties

acceptsTab?

optional acceptsTab: boolean

Defined in: react/src/generated/jsx.ts:5778

Whether Tab will result in a tab character being entered.


bottomMargin?

optional bottomMargin: number

Defined in: react/src/generated/jsx.ts:5788

The bottom margin for text in the text view.

Note that this property is confusingly named. In CSS terms, the value set here is padding, and it is applied in addition to the padding from the theme.

Don't confuse this property with [property@Gtk.Widget:margin-bottom].


buffer?

optional buffer: TextBuffer

Defined in: react/src/generated/jsx.ts:5790

The buffer which is displayed.


canFocus?

optional canFocus: boolean

Defined in: react/src/generated/jsx.ts:412

Whether the widget or any of its descendents can accept the input focus.

This property is meant to be set by widget implementations, typically in their instance init function.

Inherited from

WidgetProps.canFocus


canTarget?

optional canTarget: boolean

Defined in: react/src/generated/jsx.ts:414

Whether the widget can receive pointer events.

Inherited from

WidgetProps.canTarget


children?

optional children: ReactNode

Defined in: react/src/generated/jsx.ts:688

Inherited from

WidgetProps.children


cssClasses?

optional cssClasses: string[]

Defined in: react/src/generated/jsx.ts:416

A list of css classes applied to this widget.

Inherited from

WidgetProps.cssClasses


cssName?

optional cssName: string

Defined in: react/src/generated/jsx.ts:423

The name of this widget in the CSS tree.

This property is meant to be set by widget implementations, typically in their instance init function.

Inherited from

WidgetProps.cssName


cursor?

optional cursor: number

Defined in: react/src/generated/jsx.ts:425

The cursor used by @widget.

Inherited from

WidgetProps.cursor


cursorVisible?

optional cursorVisible: boolean

Defined in: react/src/generated/jsx.ts:5792

If the insertion cursor is shown.


editable?

optional editable: boolean

Defined in: react/src/generated/jsx.ts:5794

Whether the text can be modified by the user.


extraMenu?

optional extraMenu: number

Defined in: react/src/generated/jsx.ts:5796

A menu model whose contents will be appended to the context menu.


focusable?

optional focusable: boolean

Defined in: react/src/generated/jsx.ts:433

Whether this widget itself will accept the input focus.

Inherited from

WidgetProps.focusable


focusOnClick?

optional focusOnClick: boolean

Defined in: react/src/generated/jsx.ts:431

Whether the widget should grab focus when it is clicked with the mouse.

This property is only relevant for widgets that can take focus.

Inherited from

WidgetProps.focusOnClick


hadjustment?

optional hadjustment: Adjustment

Defined in: react/src/generated/jsx.ts:5882

Horizontal GtkAdjustment of the scrollable widget.

This adjustment is shared between the scrollable widget and its parent.


halign?

optional halign: Align

Defined in: react/src/generated/jsx.ts:435

How to distribute horizontal space if widget gets extra space.

Inherited from

WidgetProps.halign


hasDefault?

optional hasDefault: boolean

Defined in: react/src/generated/jsx.ts:437

Whether the widget is the default widget.

Inherited from

WidgetProps.hasDefault


hasFocus?

optional hasFocus: boolean

Defined in: react/src/generated/jsx.ts:439

Whether the widget has the input focus.

Inherited from

WidgetProps.hasFocus


hasTooltip?

optional hasTooltip: boolean

Defined in: react/src/generated/jsx.ts:448

Enables or disables the emission of the [signal@Gtk.Widget::query-tooltip] signal on @widget.

A true value indicates that widget can have a tooltip, in this case the widget will be queried using [signal@Gtk.Widget::query-tooltip] to determine whether it will provide a tooltip or not.

Inherited from

WidgetProps.hasTooltip


heightRequest?

optional heightRequest: number

Defined in: react/src/generated/jsx.ts:454

Overrides for height request of the widget.

If this is -1, the natural request will be used.

Inherited from

WidgetProps.heightRequest


hexpand?

optional hexpand: boolean

Defined in: react/src/generated/jsx.ts:456

Whether to expand horizontally.

Inherited from

WidgetProps.hexpand


hexpandSet?

optional hexpandSet: boolean

Defined in: react/src/generated/jsx.ts:458

Whether to use the hexpand property.

Inherited from

WidgetProps.hexpandSet


hscrollPolicy?

optional hscrollPolicy: ScrollablePolicy

Defined in: react/src/generated/jsx.ts:5884

Determines when horizontal scrolling should start.


imModule?

optional imModule: string

Defined in: react/src/generated/jsx.ts:5805

Which IM (input method) module should be used for this text_view.

See [class@Gtk.IMMulticontext].

Setting this to a non-%NULL value overrides the system-wide IM module setting. See the GtkSettings [property@Gtk.Settings:gtk-im-module] property.


indent?

optional indent: number

Defined in: react/src/generated/jsx.ts:5813

Amount to indent the paragraph, in pixels.

A negative value of indent will produce a hanging indentation. That is, the first line will have the full width, and subsequent lines will be indented by the absolute value of indent.


inputHints?

optional inputHints: InputHints

Defined in: react/src/generated/jsx.ts:5818

Additional hints (beyond [property@Gtk.TextView:input-purpose]) that allow input methods to fine-tune their behaviour.


inputPurpose?

optional inputPurpose: InputPurpose

Defined in: react/src/generated/jsx.ts:5825

The purpose of this text field.

This property can be used by on-screen keyboards and other input methods to adjust their behaviour.


justification?

optional justification: Justification

Defined in: react/src/generated/jsx.ts:5827

Left, right, or center justification.


layoutManager?

optional layoutManager: LayoutManager

Defined in: react/src/generated/jsx.ts:466

The [class@Gtk.LayoutManager] instance to use to compute the preferred size of the widget, and allocate its children.

This property is meant to be set by widget implementations, typically in their instance init function.

Inherited from

WidgetProps.layoutManager


leftMargin?

optional leftMargin: number

Defined in: react/src/generated/jsx.ts:5837

The default left margin for text in the text view.

Tags in the buffer may override the default.

Note that this property is confusingly named. In CSS terms, the value set here is padding, and it is applied in addition to the padding from the theme.


limitEvents?

optional limitEvents: boolean

Defined in: react/src/generated/jsx.ts:475

Makes this widget act like a modal dialog, with respect to event delivery.

Global event controllers will not handle events with targets inside the widget, unless they are set up to ignore propagation limits. See [method@Gtk.EventController.set_propagation_limit].

Inherited from

WidgetProps.limitEvents


marginBottom?

optional marginBottom: number

Defined in: react/src/generated/jsx.ts:483

Margin on bottom side of widget.

This property adds margin outside of the widget's normal size request, the margin will be added in addition to the size from [method@Gtk.Widget.set_size_request] for example.

Inherited from

WidgetProps.marginBottom


marginEnd?

optional marginEnd: number

Defined in: react/src/generated/jsx.ts:494

Margin on end of widget, horizontally.

This property supports left-to-right and right-to-left text directions.

This property adds margin outside of the widget's normal size request, the margin will be added in addition to the size from [method@Gtk.Widget.set_size_request] for example.

Inherited from

WidgetProps.marginEnd


marginStart?

optional marginStart: number

Defined in: react/src/generated/jsx.ts:505

Margin on start of widget, horizontally.

This property supports left-to-right and right-to-left text directions.

This property adds margin outside of the widget's normal size request, the margin will be added in addition to the size from [method@Gtk.Widget.set_size_request] for example.

Inherited from

WidgetProps.marginStart


marginTop?

optional marginTop: number

Defined in: react/src/generated/jsx.ts:513

Margin on top side of widget.

This property adds margin outside of the widget's normal size request, the margin will be added in addition to the size from [method@Gtk.Widget.set_size_request] for example.

Inherited from

WidgetProps.marginTop


monospace?

optional monospace: boolean

Defined in: react/src/generated/jsx.ts:5844

Whether text should be displayed in a monospace font.

If %TRUE, set the .monospace style class on the text view to indicate that a monospace font is desired.


name?

optional name: string

Defined in: react/src/generated/jsx.ts:515

The name of the widget.

Inherited from

WidgetProps.name


onBackspace()?

optional onBackspace: (self) => void

Defined in: react/src/generated/jsx.ts:5902

Gets emitted when the user asks for it.

The ::backspace signal is a keybinding signal.

The default bindings for this signal are Backspace and Shift+Backspace.

Parameters

ParameterType
selfTextView

Returns

void


onCopyClipboard()?

optional onCopyClipboard: (self) => void

Defined in: react/src/generated/jsx.ts:5912

Gets emitted to copy the selection to the clipboard.

The ::copy-clipboard signal is a keybinding signal.

The default bindings for this signal are Ctrl+c and Ctrl+Insert.

Parameters

ParameterType
selfTextView

Returns

void


onCutClipboard()?

optional onCutClipboard: (self) => void

Defined in: react/src/generated/jsx.ts:5922

Gets emitted to cut the selection to the clipboard.

The ::cut-clipboard signal is a keybinding signal.

The default bindings for this signal are Ctrl+x and Shift+Delete.

Parameters

ParameterType
selfTextView

Returns

void


onDeleteFromCursor()?

optional onDeleteFromCursor: (self, type, count) => void

Defined in: react/src/generated/jsx.ts:5937

Gets emitted when the user initiates a text deletion.

The ::delete-from-cursor signal is a keybinding signal.

If the type is %GTK_DELETE_CHARS, GTK deletes the selection if there is one, otherwise it deletes the requested number of characters.

The default bindings for this signal are Delete for deleting a character, Ctrl+Delete for deleting a word and Ctrl+Backspace for deleting a word backwards.

Parameters

ParameterType
selfTextView
typeDeleteType
countnumber

Returns

void


onDestroy()?

optional onDestroy: (self) => void

Defined in: react/src/generated/jsx.ts:593

Signals that all holders of a reference to the widget should release the reference that they hold.

May result in finalization of the widget if all references are released.

This signal is not suitable for saving widget state.

Parameters

ParameterType
selfWidget

Returns

void

Inherited from

WidgetProps.onDestroy


onDirectionChanged()?

optional onDirectionChanged: (self, previousDirection) => void

Defined in: react/src/generated/jsx.ts:595

Emitted when the text direction of a widget changes.

Parameters

ParameterType
selfWidget
previousDirectionTextDirection

Returns

void

Inherited from

WidgetProps.onDirectionChanged


onExtendSelection()?

optional onExtendSelection: (self, granularity, location, start, end) => boolean

Defined in: react/src/generated/jsx.ts:5943

Emitted when the selection needs to be extended at @location.

Parameters

ParameterType
selfTextView
granularityTextExtendSelection
locationTextIter
startTextIter
endTextIter

Returns

boolean


onHide()?

optional onHide: (self) => void

Defined in: react/src/generated/jsx.ts:600

Emitted when widget is hidden.

Parameters

ParameterType
selfWidget

Returns

void

Inherited from

WidgetProps.onHide


onInsertAtCursor()?

optional onInsertAtCursor: (self, string) => void

Defined in: react/src/generated/jsx.ts:5958

Gets emitted when the user initiates the insertion of a fixed string at the cursor.

The ::insert-at-cursor signal is a keybinding signal.

This signal has no default bindings.

Parameters

ParameterType
selfTextView
stringstring

Returns

void


onInsertEmoji()?

optional onInsertEmoji: (self) => void

Defined in: react/src/generated/jsx.ts:5968

Gets emitted to present the Emoji chooser for the @text_view.

The ::insert-emoji signal is a keybinding signal.

The default bindings for this signal are Ctrl+. and Ctrl+;

Parameters

ParameterType
selfTextView

Returns

void


onKeynavFailed()?

optional onKeynavFailed: (self, direction) => boolean

Defined in: react/src/generated/jsx.ts:606

Emitted if keyboard navigation fails.

See [method@Gtk.Widget.keynav_failed] for details.

Parameters

ParameterType
selfWidget
directionDirectionType

Returns

boolean

Inherited from

WidgetProps.onKeynavFailed


onMap()?

optional onMap: (self) => void

Defined in: react/src/generated/jsx.ts:618

Emitted when widget is going to be mapped.

A widget is mapped when the widget is visible (which is controlled with [property@Gtk.Widget:visible]) and all its parents up to the toplevel widget are also visible.

The ::map signal can be used to determine whether a widget will be drawn, for instance it can resume an animation that was stopped during the emission of [signal@Gtk.Widget::unmap].

Parameters

ParameterType
selfWidget

Returns

void

Inherited from

WidgetProps.onMap


onMnemonicActivate()?

optional onMnemonicActivate: (self, groupCycling) => boolean

Defined in: react/src/generated/jsx.ts:624

Emitted when a widget is activated via a mnemonic.

The default handler for this signal activates widget if group_cycling is false, or just makes widget grab focus if group_cycling is true.

Parameters

ParameterType
selfWidget
groupCyclingboolean

Returns

boolean

Inherited from

WidgetProps.onMnemonicActivate


onMoveCursor()?

optional onMoveCursor: (self, step, count, extendSelection) => void

Defined in: react/src/generated/jsx.ts:5994

Gets emitted when the user initiates a cursor movement.

The ::move-cursor signal is a keybinding signal. If the cursor is not visible in @text_view, this signal causes the viewport to be moved instead.

Applications should not connect to it, but may emit it with g_signal_emit_by_name() if they need to control the cursor programmatically.

The default bindings for this signal come in two variants, the variant with the Shift modifier extends the selection, the variant without it does not. There are too many key combinations to list them all here.

  • , , , move by individual characters/lines
  • Ctrl+, etc. move by words/paragraphs
  • Home and End move to the ends of the buffer
  • PgUp and PgDn move vertically by pages
  • Ctrl+PgUp and Ctrl+PgDn move horizontally by pages

Parameters

ParameterType
selfTextView
stepMovementStep
countnumber
extendSelectionboolean

Returns

void


onMoveFocus()?

optional onMoveFocus: (self, direction) => void

Defined in: react/src/generated/jsx.ts:633

Emitted when the focus is moved.

The ::move-focus signal is a keybinding signal.

The default bindings for this signal are Tab to move forward, and Shift+Tab to move backward.

Parameters

ParameterType
selfWidget
directionDirectionType

Returns

void

Inherited from

WidgetProps.onMoveFocus


onMoveViewport()?

optional onMoveViewport: (self, step, count) => void

Defined in: react/src/generated/jsx.ts:6010

Gets emitted to move the viewport.

The ::move-viewport signal is a keybinding signal, which can be bound to key combinations to allow the user to move the viewport, i.e. change what part of the text view is visible in a containing scrolled window.

There are no default bindings for this signal.

Parameters

ParameterType
selfTextView
stepScrollStep
countnumber

Returns

void


onPasteClipboard()?

optional onPasteClipboard: (self) => void

Defined in: react/src/generated/jsx.ts:6025

Gets emitted to paste the contents of the clipboard into the text view.

The ::paste-clipboard signal is a keybinding signal.

The default bindings for this signal are Ctrl+v and Shift+Insert.

Parameters

ParameterType
selfTextView

Returns

void


onPreeditChanged()?

optional onPreeditChanged: (self, preedit) => void

Defined in: react/src/generated/jsx.ts:6036

Emitted when preedit text of the active IM changes.

If an input method is used, the typed text will not immediately be committed to the buffer. So if you are interested in the text, connect to this signal.

This signal is only emitted if the text at the given position is actually editable.

Parameters

ParameterType
selfTextView
preeditstring

Returns

void


onQueryTooltip()?

optional onQueryTooltip: (self, x, y, keyboardMode, tooltip) => boolean

Defined in: react/src/generated/jsx.ts:648

Emitted when the widget’s tooltip is about to be shown.

This happens when the [property@Gtk.Widget:has-tooltip] property is true and the hover timeout has expired with the cursor hovering above @widget; or emitted when widget got focus in keyboard mode.

Using the given coordinates, the signal handler should determine whether a tooltip should be shown for @widget. If this is the case true should be returned, false otherwise. Note that if keyboard_mode is true, the values of x and y are undefined and should not be used.

The signal handler is free to manipulate tooltip with the therefore destined function calls.

Parameters

ParameterType
selfWidget
xnumber
ynumber
keyboardModeboolean
tooltipTooltip

Returns

boolean

Inherited from

WidgetProps.onQueryTooltip


onRealize()?

optional onRealize: (self) => void

Defined in: react/src/generated/jsx.ts:661

Emitted when widget is associated with a GdkSurface.

This means that [method@Gtk.Widget.realize] has been called or the widget has been mapped (that is, it is going to be drawn).

Parameters

ParameterType
selfWidget

Returns

void

Inherited from

WidgetProps.onRealize


onSelectAll()?

optional onSelectAll: (self, select) => void

Defined in: react/src/generated/jsx.ts:6048

Gets emitted to select or unselect the complete contents of the text view.

The ::select-all signal is a keybinding signal.

The default bindings for this signal are Ctrl+a and Ctrl+/ for selecting and Shift+Ctrl+a and Ctrl+`` for unselecting.

Parameters

ParameterType
selfTextView
selectboolean

Returns

void


onSetAnchor()?

optional onSetAnchor: (self) => void

Defined in: react/src/generated/jsx.ts:6059

Gets emitted when the user initiates settings the "anchor" mark.

The ::set-anchor signal is a keybinding signal which gets emitted when the user initiates setting the "anchor" mark. The "anchor" mark gets placed at the same position as the "insert" mark.

This signal has no default bindings.

Parameters

ParameterType
selfTextView

Returns

void


onShow()?

optional onShow: (self) => void

Defined in: react/src/generated/jsx.ts:663

Emitted when widget is shown.

Parameters

ParameterType
selfWidget

Returns

void

Inherited from

WidgetProps.onShow


onStateFlagsChanged()?

optional onStateFlagsChanged: (self, flags) => void

Defined in: react/src/generated/jsx.ts:669

Emitted when the widget state changes.

See [method@Gtk.Widget.get_state_flags].

Parameters

ParameterType
selfWidget
flagsStateFlags

Returns

void

Inherited from

WidgetProps.onStateFlagsChanged


onToggleCursorVisible()?

optional onToggleCursorVisible: (self) => void

Defined in: react/src/generated/jsx.ts:6068

Gets emitted to toggle the cursor-visible property.

The ::toggle-cursor-visible signal is a keybinding signal.

The default binding for this signal is F7.

Parameters

ParameterType
selfTextView

Returns

void


onToggleOverwrite()?

optional onToggleOverwrite: (self) => void

Defined in: react/src/generated/jsx.ts:6076

Gets emitted to toggle the overwrite mode of the text view.

The ::toggle-overwrite signal is a keybinding signal.

The default binding for this signal is Insert.

Parameters

ParameterType
selfTextView

Returns

void


onUnmap()?

optional onUnmap: (self) => void

Defined in: react/src/generated/jsx.ts:679

Emitted when widget is going to be unmapped.

A widget is unmapped when either it or any of its parents up to the toplevel widget have been set as hidden.

As ::unmap indicates that a widget will not be shown any longer, it can be used to, for example, stop an animation on the widget.

Parameters

ParameterType
selfWidget

Returns

void

Inherited from

WidgetProps.onUnmap


onUnrealize()?

optional onUnrealize: (self) => void

Defined in: react/src/generated/jsx.ts:686

Emitted when the GdkSurface associated with widget is destroyed.

This means that [method@Gtk.Widget.unrealize] has been called or the widget has been unmapped (that is, it is going to be hidden).

Parameters

ParameterType
selfWidget

Returns

void

Inherited from

WidgetProps.onUnrealize


opacity?

optional opacity: number

Defined in: react/src/generated/jsx.ts:517

The requested opacity of the widget.

Inherited from

WidgetProps.opacity


overflow?

optional overflow: Overflow

Defined in: react/src/generated/jsx.ts:524

How content outside the widget's content area is treated.

This property is meant to be set by widget implementations, typically in their instance init function.

Inherited from

WidgetProps.overflow


overwrite?

optional overwrite: boolean

Defined in: react/src/generated/jsx.ts:5846

Whether entered text overwrites existing contents.


parent?

optional parent: Widget

Defined in: react/src/generated/jsx.ts:526

The parent widget of this widget.

Inherited from

WidgetProps.parent


pixelsAboveLines?

optional pixelsAboveLines: number

Defined in: react/src/generated/jsx.ts:5848

Pixels of blank space above paragraphs.


pixelsBelowLines?

optional pixelsBelowLines: number

Defined in: react/src/generated/jsx.ts:5850

Pixels of blank space below paragraphs.


pixelsInsideWrap?

optional pixelsInsideWrap: number

Defined in: react/src/generated/jsx.ts:5852

Pixels of blank space between wrapped lines in a paragraph.


receivesDefault?

optional receivesDefault: boolean

Defined in: react/src/generated/jsx.ts:528

Whether the widget will receive the default action when it is focused.

Inherited from

WidgetProps.receivesDefault


ref?

optional ref: Ref<TextView>

Defined in: react/src/generated/jsx.ts:6078


rightMargin?

optional rightMargin: number

Defined in: react/src/generated/jsx.ts:5862

The default right margin for text in the text view.

Tags in the buffer may override the default.

Note that this property is confusingly named. In CSS terms, the value set here is padding, and it is applied in addition to the padding from the theme.


root?

optional root: Root

Defined in: react/src/generated/jsx.ts:534

The GtkRoot widget of the widget tree containing this widget.

This will be NULL if the widget is not contained in a root widget.

Inherited from

WidgetProps.root


scaleFactor?

optional scaleFactor: number

Defined in: react/src/generated/jsx.ts:536

The scale factor of the widget.

Inherited from

WidgetProps.scaleFactor


sensitive?

optional sensitive: boolean

Defined in: react/src/generated/jsx.ts:538

Whether the widget responds to input.

Inherited from

WidgetProps.sensitive


tabs?

optional tabs: number

Defined in: react/src/generated/jsx.ts:5864

Custom tabs for this text.


tooltipMarkup?

optional tooltipMarkup: string

Defined in: react/src/generated/jsx.ts:554

Sets the text of tooltip to be the given string, which is marked up with Pango markup.

Also see [method@Gtk.Tooltip.set_markup].

This is a convenience property which will take care of getting the tooltip shown if the given string is not NULL: [property@Gtk.Widget:has-tooltip] will automatically be set to true and there will be taken care of [signal@Gtk.Widget::query-tooltip] in the default signal handler.

Note that if both [property@Gtk.Widget:tooltip-text] and [property@Gtk.Widget:tooltip-markup] are set, the last one wins.

Inherited from

WidgetProps.tooltipMarkup


tooltipText?

optional tooltipText: string

Defined in: react/src/generated/jsx.ts:569

Sets the text of tooltip to be the given string.

Also see [method@Gtk.Tooltip.set_text].

This is a convenience property which will take care of getting the tooltip shown if the given string is not NULL: [property@Gtk.Widget:has-tooltip] will automatically be set to true and there will be taken care of [signal@Gtk.Widget::query-tooltip] in the default signal handler.

Note that if both [property@Gtk.Widget:tooltip-text] and [property@Gtk.Widget:tooltip-markup] are set, the last one wins.

Inherited from

WidgetProps.tooltipText


topMargin?

optional topMargin: number

Defined in: react/src/generated/jsx.ts:5874

The top margin for text in the text view.

Note that this property is confusingly named. In CSS terms, the value set here is padding, and it is applied in addition to the padding from the theme.

Don't confuse this property with [property@Gtk.Widget:margin-top].


vadjustment?

optional vadjustment: Adjustment

Defined in: react/src/generated/jsx.ts:5890

Vertical GtkAdjustment of the scrollable widget.

This adjustment is shared between the scrollable widget and its parent.


valign?

optional valign: Align

Defined in: react/src/generated/jsx.ts:571

How to distribute vertical space if widget gets extra space.

Inherited from

WidgetProps.valign


vexpand?

optional vexpand: boolean

Defined in: react/src/generated/jsx.ts:573

Whether to expand vertically.

Inherited from

WidgetProps.vexpand


vexpandSet?

optional vexpandSet: boolean

Defined in: react/src/generated/jsx.ts:575

Whether to use the vexpand property.

Inherited from

WidgetProps.vexpandSet


visible?

optional visible: boolean

Defined in: react/src/generated/jsx.ts:577

Whether the widget is visible.

Inherited from

WidgetProps.visible


vscrollPolicy?

optional vscrollPolicy: ScrollablePolicy

Defined in: react/src/generated/jsx.ts:5892

Determines when vertical scrolling should start.


widthRequest?

optional widthRequest: number

Defined in: react/src/generated/jsx.ts:583

Overrides for width request of the widget.

If this is -1, the natural request will be used.

Inherited from

WidgetProps.widthRequest


wrapMode?

optional wrapMode: WrapMode

Defined in: react/src/generated/jsx.ts:5876

Whether to wrap lines never, at word boundaries, or at character boundaries.