Quickfort Alias Guide

Aliases allow you to use simple words to represent complicated key sequences when configuring buildings and stockpiles in quickfort #query blueprints.

For example, say you have the following #build and #place blueprints:

#build masonry workshop
~, ~,~,`,`,`
~,wm,~,`,`,`
~, ~,~,`,`,`

#place stockpile for mason
~,~,~,s,s,s
~,~,~,s,s,s
~,~,~,s,s,s

and you want to configure the stockpile to hold only non-economic (“other”) stone and to give to the adjacent mason workshop. You could write the key sequences directly:

#query configure stockpile with expanded key sequences
~,~,~,s{Down 5}deb{Right}{Down 2}p^,`,`
~,~,~,g{Left 2}&,                   `,`
~,~,~,`,                            `,`

or you could use aliases:

#query configure stockpile with aliases
~,~,~,otherstone,`,`
~,~,~,give2left, `,`
~,~,~,`,         `,`

If the stockpile had only a single tile, you could also replay both aliases in a single cell:

#query configure mason with multiple aliases in one cell
~,~,~,{otherstone}{give2left},`,`
~,~,~,`,                      `,`
~,~,~,`,                      `,`

With aliases, blueprints are much easier to read and understand. They also save you from having to copy the same long key sequences everywhere.

Alias definition files

DFHack comes with a library of aliases for you to use that are always available when you run a #query blueprint. Many blueprints can be built with just those aliases. This “standard alias library” is stored in data/quickfort/aliases-common.txt (installed under the hack folder in your DFHack installation). The aliases in that file are described at the bottom of this document.

Please do not edit the aliases in the standard library directly. The file will get overwritten when DFHack is updated and you’ll lose your changes. Instead, add your custom aliases to dfhack-config/quickfort/aliases.txt or directly to your blueprints in an #aliases section. Your custom alias definitions take precedence over any definitions in the standard library.

Alias syntax and usage

The syntax for defining aliases is:

aliasname: expansion

Where aliasname is at least two letters or digits long (dashes and underscores are also allowed) and expansion is whatever you would type into the DF UI.

You use an alias by typing its name into a #query blueprint cell where you want it to be applied. You can use an alias by itself or as part of a larger sequence, potentially with other aliases. If the alias is the only text in the cell, the alias name is matched and its expansion is used. If the alias has other keys before or after it, the alias name must be surrounded in curly brackets ({ and }). An alias can be surrounded in curly brackets even if it is the only text in the cell, it just isn’t necesary. For example, the following blueprint uses the aliasname alias by itself in the first two rows and uses it as part of a longer sequence in the third row:

#query apply alias 'aliasname' in three different ways
aliasname
{aliasname}
literaltext{aliasname}literaltext

For a more concrete example of an alias definition, a simple alias that configures a stockpile to have no bins (C) and no barrels (E) assigned to it would look like this:

nocontainers: CE

The alias definition can also contain references to other aliases by including the alias names in curly brackets. For example, nocontainers could be equivalently defined like this:

nobins: C
nobarrels: E
nocontainers: {nobins}{nobarrels}

Aliases used in alias definitions must be surrounded by curly brackets, even if they are the only text in the definition:

alias1: text1
alias2: alias1
alias3: {alias1}

Here, alias1 and alias3 expand to text1, but alias2 expands to the literal text alias1.

Keycodes

Non-printable characters, like the arrow keys, are represented by their keycode name and are also surrounded by curly brackets, like {Right} or {Enter}. Keycodes are used exactly like aliases – they just have special expansions that you wouldn’t be able to write yourself. In order to avoid naming conflicts between aliases and keycodes, the convention is to start aliases with a lowercase letter.

Any keycode name from the DF interface definition file (data/init/interface.txt) is valid, but only a few keycodes are actually useful for blueprints:

Up
Down
Left
Right
Enter
ESC
Backspace
Space
Tab

There is also one pseudo-keycode that quickfort recognizes:

Empty

which has an empty expansion. It is primarily useful for defining blank default values for Sub-aliases.

Repetitions

Anything enclosed within curly brackets can also have a number, indicating how many times that alias or keycode should be repeated. For example: {togglesequence 9} or {Down 5} will repeat the togglesequence alias nine times and the Down keycode five times, respectively.

Modifier keys

Ctrl, Alt, and Shift modifiers can be specified for the next key by adding them into the key sequence. For example, Alt-h is written as {Alt}h.

Shorthand characters

Some frequently-used keycodes are assigned shorthand characters. Think of them as single-character aliases that don’t need to be surrounded in curly brackets:

&   expands to {Enter}
@   expands to {Shift}{Enter}
~   expands to {Alt}
!   expands to {Ctrl}
^   expands to {ESC}

If you need literal versions of the shorthand characters, surround them in curly brackets, for example: use {!} for a literal exclamation point.

Built-in aliases

Most aliases that come with DFHack are in aliases-common.txt, but there is one alias built into the code for the common shorthand for “make room”:

r+  expands to r+{Enter}

This needs special code support since + can’t normally be used in alias names. You can use it just like any other alias, either by itself in a cell (r+) or surrounded in curly brackets ({r+}).

Sub-aliases

You can specify sub-aliases that will only be defined while the current alias is being resolved. This is useful for “injecting” custom behavior into the middle of a larger alias. As a simple example, the givename alias is defined like this:

givename: !n{name}&

Note the use of the name alias inside of the givename expansion. In your #query blueprint, you could write something like this, say, while over your main drawbridge:

{givename name="Front Gate"}

The value that you give the sub-alias name will be used when the givename alias is expanded. Without sub-aliases, we’d have to define givename like this:

givenameprefix: !n
givenamesuffix: &

and use it like this:

{givenameprefix}Front Gate{givenamesuffix}

which is more difficult to write and more difficult to understand.

A handy technique is to define an alias with some sort of default behavior and then use sub-aliases to override that behavior as necessary. For example, here is a simplified version of the standard quantum alias that sets up quantum stockpiles:

quantum_enable: {enableanimals}{enablefood}{enablefurniture}...
quantum: {linksonly}{nocontainers}{quantum_enable}

You can use the default behavior of quantum_enable by just using the quantum alias by itself. But you can override quantum_enable to just enable furniture for some specific stockpile like this:

{quantum quantum_enable={enablefurniture}}

If an alias uses a sub-alias in its expansion, but the sub-alias is not defined when the alias is used, quickfort will halt the #query blueprint with an error. If you want your aliases to work regardless of whether sub-aliases are defined, then you must define them with default values like quantum_enable above. If a default value should be blank, like the name sub-alias used by the givename alias above, define it with the {Empty} pesudo-keycode:

name: {Empty}

Sub-aliases must be in one of the following formats:

subaliasname=keyswithnospaces
subaliasname="keys with spaces or {aliases}"
subaliasname={singlealias}

If you specify both a sub-alias and a number of repetitions, the number for repetitions goes last, right before the }:

{alias subaliasname=value repetitions}

Beyond query mode

#query blueprints normally do things in DF query mode, but nobody said that we have to stay in query mode. #query blueprints send arbitrary key sequences to Dwarf Fortress. Anything you can do by typing keys into DF, you can do in a #query blueprint. It is absolutely fine to temporarily exit out of query mode, go into, say, hauling or zone or hotkey mode, and do whatever needs to be done.

You just have to make certain to exit out of that alternate mode and get back into query mode at the end of the key sequence. That way quickfort can continue on configuring the next tile – a tile configuration that assumes the game is still in query mode.

For example, here is the standard library alias for giving a name to a zone:

namezone: ^i{givename}^q

The first ^ exits out of query mode. Then i enters zones mode. We then reuse the standard alias for giving something a name. Finally, we exit out of zones mode with another ^ and return to query mode.

The DFHack standard alias library

DFHack comes with many useful aliases for you to use in your blueprints. Many blueprints can be built with just these aliases alone, with no custom aliases required.

This section goes through all aliases provided by the DFHack standard alias library, discussing their intended usage and detailing sub-aliases that you can define to customize their behavior.

If you do define your own custom aliases in dfhack-config/quickfort/aliases.txt, try to build on library alias components. For example, if you create an alias to modify particular furniture stockpile settings, start your alias with {furnitureprefix} instead of s{Down 2}. Using library prefixes will allow library sub-aliases to work with your aliases just like they do with library aliases. In this case, using {furnitureprefix} will allow your stockpile customization alias to work with both stockpiles and hauling routes.

Note that some aliases use the DFHack-provided search prompts. If you get errors while running #query blueprints, ensure the DFHack search plugin is enabled.

Naming aliases

These aliases give descriptive names to workshops, levers, stockpiles, zones, etc. Dwarf Fortress building, stockpile, and zone names have a maximum length of 20 characters.

Alias Sub-aliases
givename name
namezone name

givename works anywhere you can hit Ctrl-n to customize a name, like when the cursor is over buildings and stockpiles. Example:

#place
f(10x2)

#query
{booze}{givename name=booze}

namezone is intended to be used when over an activity zone. It includes commands to get into zones mode, set the zone name, and get back to query mode. Example:

#zone
n(2x2)

#query
{namezone name="guard dog pen"}

Quantum stockpile aliases

These aliases make it easy to create minecart stop-based quantum stockpiles.

Alias Sub-aliases
quantum
name
quantum_enable
quantumstopfromnorth
name
stop_name
route_enable
quantumstopfromsouth
quantumstopfromeast
quantumstopfromwest
sp_link
move
move_back
quantumstop
name
stop_name
route_enable
move
move_back
sp_links

The idea is to use a minecart on a track stop to dump an infinite number of items into a receiving “quantum” stockpile, which significantly simplifies stockpile management. These aliases configure the quantum stockpile and hauling route that make it all work. Here is a complete example for quantum stockpiling weapons, armor, and ammunition. It has a 3x1 feeder stockpile on the bottom (South), the trackstop in the center, and the quantum stockpile on the top (North). Note that the feeder stockpile is the only stockpile that needs to be configured to control which types of items end up in the quantum stockpile. By default, the hauling route and quantum stockpile itself simply accept whatever is put into them.

#place
 ,c
 ,
pdz(3x1)

#build
 ,
 ,trackstopN

#query message(remember to assign a minecart to the new route)
 ,quantum
 ,quantumstopfromsouth
nocontainers

The quantum alias configures a 1x1 stockpile to be a quantum stockpile. It bans all containers and prevents the stockpile from being manually filled. By default, it also enables storage of all item categories (except corpses and refuse), so it doesn’t really matter what letter you use to place the stockpile. Refuse is excluded by default since otherwise clothes and armor in the quantum stockpile would rot away. If you want corpses or bones in your quantum stockpile, use y and/or r to place the stockpile and the quantum alias will just enable the remaining types. If you do enable refuse in your quantum stockpile, be sure you avoid putting useful clothes or armor in there!

The quantumstopfromsouth alias is run over the track stop and configures the hauling route, again, allowing all item categories into the minecart by default so any item that can go into the feeder stockpile can then be placed in the minecart. It also links the hauling route with the feeder stockpile to the South.The track stop does not need to be fully constructed before the #query blueprint is run, but the feeder stockpile needs to exist so we can link to it. This means that the three blueprints above can be run one right after another, without any dwarven labor in between them, and the quantum stockpile will work properly.

Finally, the nocontainers alias simply configures the feeder stockpile to not have any containers (which would just get in the way here). If we wanted to be more specific about what item types we want in the quantum stockpile, we could configure the feeder stockpile further, for example with standard stockpile adjustment aliases.

After the blueprints are run, the last step is to manually assign a minecart to the newly-defined hauling route.

You can define sub-aliases to customize how these aliases work, for example to have fine-grained control over what item types are enabled for the route and quantum stockpile. We’ll go over those options below, but first, here is an example for how to just give names to everything:

#query message(remember to assign a minecart to the new route)
 ,{quantum name="armory quantum"}
 ,{quantumstopfromsouth name="Armory quantum" stop_name="Armory quantum stop"}{givename name="armory dumper"}
{givename name="armory feeder"}

All name sub-aliases are completely optional, of course. Keep in mind that hauling route names have a maximum length of 22 characters, hauling route stop names have a maximum length of 21 characters, and all other names have a maximum length of 20 characters.

If you want to be absolutely certain that nothing ends up in your quantum stockpile other than what you’ve configured in the feeder stockpile, you can set the quantum_enable sub-alias for the quantum alias. This can prevent, for example, somebody’s knocked-out tooth from being considered part of your furniture quantum stockpile when it happened to land on it during a fistfight:

#query
{quantum name="furniture quantum" quantum_enable={enablefurniture}}

You can have similar control over the hauling route if you need to be more selective about what item types are allowed into the minecart. If you have multiple specialized quantum stockpiles that use a common feeder pile, for example, you can set the route_enable sub-alias:

#query
{quantumstopfromsouth name="Steel bar quantum" route_enable="{enablebars}{steelbars}"}

Any of the stockpile configuration aliases can be used for either the quantum_enable or route_enable sub-aliases. Experienced Dwarf Fortress players may be wondering how the same aliases can work in both contexts since the keys for entering the configuration screen differ. Fear not! There is some sub-alias magic at work here. If you define your own stockpile configuraiton aliases, you can use the magic yourself by building your aliases on the *prefix aliases described later in this guide.

Finally, the quantumstop alias is a more general version of the simpler quantumstopfrom* aliases. The quantumstopfrom* aliases assume that a single feeder stockpile is orthogonally adjacent to your track stop (which is how most people set them up). If your feeder stockpile is somewhere further away, or you have multiple feeder stockpiles to link, you can use the quantumstop alias directly. In addition to the sub-aliases used in the quantumstopfrom* alias, you can define the move and move_back sub-aliases, which let you specify the cursor keys required to move from the track stop to the (single) feeder stockpile and back again, respectively:

#query
{quantumstop move="{Right 2}{Up}" move_back="{Down}{Left 2}"}

If you have multiple stockpiles to link, define the sp_links sub-alias, which can chain several sp_link aliases together, each with their own movement configuration:

#query
{quantumstop sp_links="{sp_link move=""{Right}{Up}"" move_back=""{Down}{Left}""}{sp_link move=""{Right}{Down}"" move_back=""{Up}{Left}""}"}

Note the doubled quotes for quoted elements that are within the outer quotes.

Farm plots

Sets a farm plot to grow the first or last type of seed in the list of available seeds for all four seasons. The last seed is usually Plump helmet spawn, suitable for post-embark. But if you only have one seed type, that’ll be grown instead.

Alias
growlastcropall
growfirstcropall

Instead of these aliases, though, it might be more useful to use the DFHack autofarm plugin.

Stockpile configuration utility aliases

Alias Sub-aliases
linksonly  
maxbins  
maxbarrels  
nobins  
nobarrels  
nocontainers  
give2up  
give2down  
give2left  
give2right  
give10up  
give10down  
give10left  
give10right  
give move
togglesequence  
togglesequence2  
masterworkonly prefix
artifactonly prefix
togglemasterwork prefix
toggleartifact prefix

linksonly, maxbins, maxbarrels, nobins, nobarrels, and nocontainers set the named basic properties on stockpiles. nocontainers sets bins and barrels to 0, but does not affect wheelbarrows since the hotkeys for changing the number of wheelbarrows depend on whether you have DFHack’s tweak max-wheelbarrow enabled. It is better to set the number of wheelbarrows via the quickfort stockpiles_max_wheelbarrows setting (set to 0 by default), or explicitly when you define the stockpile in the #place blueprint.

The give* aliases set a stockpile to give to a workshop or another stockpile located at the indicated number of tiles in the indicated direction from the current tile. For example, here we use the give2down alias to connect an otherstone stockpile with a mason workshop:

#place
s,s,s,s,s
s, , , ,s
s, , , ,s
s, , , ,s
s,s,s,s,s

#build
`,`,`,`,`
`, , , ,`
`, ,wm,,`
`, , , ,`
`,`,`,`,`

#query
 , ,give2down
otherstone

and here is a generic stone stockpile that gives to a stockpile that only takes flux:

#place
s(10x1)
s(10x10)

#query
flux
,
give2up

If you want to give to some other tile that is not already covered by the give2* or give10* aliases, you can use the generic give alias and specify the movement keys yourself in the move sub-alias. Here is how to give to a stockpile or workshop one z-level above, 9 tiles to the left, and 14 tiles down:

#query
{give move="<{Left 9}{Down 14}"}

togglesequence and togglesequence2 send {Down}{Enter} or {Down 2}{Enter} to toggle adjacent (or alternating) items in a list. This is useful when toggling a bunch of related item types in the stockpile config. For example, the dye alias in the standard alias library needs to select four adjacent items:

dye: {foodprefix}b{Right}{Down 11}{Right}{Down 28}{togglesequence 4}^

Finally, the masterwork and artifact group of aliases configure the corresponding allowable core quality for the stockpile categories that have them. This alias is used to implement category-specific aliases below, like artifactweapons and forbidartifactweapons.

Stockpile adjustment aliases

For each stockpile item category, there are three standard aliases:

  • *prefix aliases enter the stockpile configuration screen and position the cursor at a particular item category in the left-most column, ready for further keys that configure the elements within that category. All other stockpile adjustment aliases are built on these prefixes. You can use them yourself to create stockpile adjustment aliases that aren’t already covered by the standard library aliases. Using the library prefix instead of creating your own also allows your stockpile configuration aliases to be used for both stockpiles and hauling routes. For example, here is the library definition for booze:

    booze: {foodprefix}b{Right}{Down 5}p{Down}p^
    
  • enable* aliases enter the stockpile configuration screen, enable all subtypes of the named category, and exit the stockpile configuration screen

  • disable* aliases enter the stockpile configuration screen, disable all subtypes of the named category, and exit the stockpile configuration screen

Prefix Enable Disable
animalsprefix enableanimals disableanimals
foodprefix enablefood disablefood
furnitureprefix enablefurniture disablefurniture
corpsesprefix enablecorpses disablecorpses
refuseprefix enablerefuse disablerefuse
stoneprefix enablestone disablestone
ammoprefix enableammo disableammo
coinsprefix enablecoins disablecoins
barsprefix enablebars disablebars
gemsprefix enablegems disablegems
finishedgoodsprefix enablefinishedgoods disablefinishedgoods
leatherprefix enableleather disableleather
clothprefix enablecloth disablecloth
woodprefix enablewood disablewood
weaponsprefix enableweapons disableweapons
armorprefix enablearmor disablearmor
sheetprefix enablesheet disablesheet

Then, for each item category, there are aliases that manipulate interesting subsets of that category:

  • Exclusive aliases forbid everthing within a category and then enable only the named item type (or named class of items)
  • forbid* aliases forbid the named type and leave the rest of the stockpile untouched.
  • permit* aliases permit the named type and leave the rest of the stockpile untouched.

Note that for specific item types (items in the third stockpile configuration column), you can only toggle the item type on and off. Aliases can’t know whether sending the {Enter} key will enable or disable the type. The forbid* aliases that affect these item types assume the item type was enabled and toggle it off. Likewise, the permit* aliases assume the item type was disabled and toggle it on. If the item type is not in the expected enabled/disabled state when the alias is run, the aliases will not behave properly.

Animal stockpile adjustments

Exclusive Forbid Permit
cages forbidcages permitcages
traps forbidtraps permittraps

Food stockpile adjustments

Exclusive Forbid Permit
preparedfood forbidpreparedfood permitpreparedfood
unpreparedfish forbidunpreparedfish permitunpreparedfish
plants forbidplants permitplants
booze forbidbooze permitbooze
seeds forbidseeds permitseeds
dye forbiddye permitdye
tallow forbidtallow permittallow
miscliquid forbidmiscliquid permitmiscliquid
wax forbidwax permitwax

Furniture stockpile adjustments

Exclusive Forbid Permit
pots forbidpots permitpots
bags    
buckets forbidbuckets permitbuckets
sand forbidsand permitsand
masterworkfurniture forbidmasterworkfurniture permitmasterworkfurniture
artifactfurniture forbidartifactfurniture permitartifactfurniture

Notes:

  • The bags alias excludes coffers and other boxes by forbidding all materials other than cloth, yarn, silk, and leather. Therefore, it is difficult to create forbidbags and permitbags without affecting other types of furniture stored in the same stockpile.
  • Because of the limitations of Dwarf Fortress, bags cannot distinguish between empty bags and bags filled with gypsum powder.

Refuse stockpile adjustments

Exclusive Forbid Permit
corpses forbidcorpses permitcorpses
rawhides forbidrawhides permitrawhides
tannedhides forbidtannedhides permittannedhides
skulls forbidskulls permitskulls
bones forbidbones permitbones
shells forbidshells permitshells
teeth forbidteeth permitteeth
horns forbidhorns permithorns
hair forbidhair permithair
craftrefuse forbidcraftrefuse permitcraftrefuse

Notes:

  • craftrefuse includes everything a craftsdwarf can use: skulls, bones, shells, teeth, horns, and hair.

Stone stockpile adjustments

Exclusive Forbid Permit
metal forbidmetal permitmetal
iron forbidiron permitiron
economic forbideconomic permiteconomic
flux forbidflux permitflux
plaster forbidplaster permitplaster
coalproducing forbidcoalproducing permitcoalproducing
otherstone forbidotherstone permitotherstone
bauxite forbidbauxite permitbauxite
clay forbidclay permitclay

Ammo stockpile adjustments

Exclusive Forbid Permit
bolts    
forbidmetalbolts  
forbidwoodenbolts  
forbidbonebolts  
masterworkammo forbidmasterworkammo permitmasterworkammo
artifactammo forbidartifactammo permitartifactammo

Bar stockpile adjustments

Exclusive Forbid
bars forbidbars
metalbars forbidmetalbars
ironbars forbidironbars
steelbars forbidsteelbars
pigironbars forbidpigironbars
otherbars forbidotherbars
coal forbidcoal
potash forbidpotash
ash forbidash
pearlash forbidpearlash
soap forbidsoap
blocks forbidblocks

Gem stockpile adjustments

Exclusive Forbid
roughgems forbidroughgems
roughglass forbidroughglass
cutgems forbidcutgems
cutglass forbidcutglass
cutstone forbidcutstone

Finished goods stockpile adjustments

Exclusive Forbid Permit
jugs    
crafts forbidcrafts permitcrafts
goblets forbidgoblets permitgoblets
masterworkfinishedgoods forbidmasterworkfinishedgoods permitmasterworkfinishedgoods
artifactfinishedgoods forbidartifactfinishedgoods permitartifactfinishedgoods

Cloth stockpile adjustments

Exclusive
thread
adamantinethread
cloth
adamantinecloth

Weapon stockpile adjustments

Exclusive Forbid Permit
forbidweapons permitweapons
forbidtrapcomponents permittrapcomponents
metalweapons forbidmetalweapons permitmetalweapons
forbidstoneweapons permitstoneweapons
forbidotherweapons permitotherweapons
ironweapons forbidironweapons permitironweapons
bronzeweapons forbidbronzeweapons permitbronzeweapons
copperweapons forbidcopperweapons permitcopperweapons
steelweapons forbidsteelweapons permitsteelweapons
masterworkweapons forbidmasterworkweapons permitmasterworkweapons
artifactweapons forbidartifactweapons permitartifactweapons

Armor stockpile adjustments

Exclusive Forbid Permit
metalarmor forbidmetalarmor permitmetalarmor
otherarmor forbidotherarmor permitotherarmor
ironarmor forbidironarmor permitironarmor
bronzearmor forbidbronzearmor permitbronzearmor
copperarmor forbidcopperarmor permitcopperarmor
steelarmor forbidsteelarmor permitsteelarmor
masterworkarmor forbidmasterworkarmor permitmasterworkarmor
artifactarmor forbidartifactarmor permitartifactarmor